LINUX.ORG.RU

Как переделать такое в параллельное выполнение?

 ,


0

1
def function_1():

	list1 = #получение из базы
	list2 = #получение из базы
	list3 = #получение из базы

	for i in range(len(list1)):
		#действия
		# внутри также используются все 3 списка



multiprocessing и joblib не работают, т.к. цикл переделывается в функцию, а она уже получается вложенной, а с вложенными они не работают

Сan't pickle...


multiprocess не падает, но внутри цикла ничего не происходит, а падает уже при попытке получить результат


result = p.map_async(function_2, range(len(list1)))
print (result.get())



c сообщением типа
io.UnsupportedOperation: seek


Как это вообще сделать?

★★★★★

Ответ на: комментарий от anonymous

А как мне оттуда потом получить список результатов?

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от Qwentor

Там в документации сверху написано что синтакс был добавлен с версии 3.5, есть возможность обновиться?

anonymous
()
Ответ на: комментарий от Qwentor

На всякий случай если получится обновиться то:


import asyncio
import random

async def factorial(name):
    return list(range(random.randrange(5, 10)))

async def main():
   results = await asyncio.gather(
       factorial("A"),
       factorial("B"),
       factorial("C"),
       )

   # results are in the same order as was specified in call to `aysncio.gather()`
   for letter, result in zip(['A', 'B', 'C'], results):
       print('Result for', letter, '-', result)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
anonymous
()
Ответ на: комментарий от Qwentor

только с исходников

почитай про asyncio. В 3.4 там есть декоратор который впоследствии стал ключевым словом async

Dred ★★★★★
()
Ответ на: комментарий от Dred

И ещё:

loop.close() обязателен?
Без него цикл вроде работает. А с ним
Task was destroyed but it is pending!

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Это будет работать параллельно только если в factorial нет блокирующего кода, всё под await. т.е. в его случае нужен какой-нить асинхронный драйвер для бд типа asyncpg/aiopg/motor.

pawnhearts ★★★★★
()
Ответ на: комментарий от pawnhearts

Данные из БД получаются ДО того кода, который я хочу запараллелить. Но внутри есть парсинг сайтов. Это тоже блокирующий код?

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от Qwentor

По теме - что мешает использовать https://docs.python.org/3.4/library/concurrent.futures.html#processpoolexecutor или Pool.map https://docs.python.org/2/library/multiprocessing.html

Передавай данные туда по одному или весь список, или бери из очереди.

Почему ты используешь range(len( вместо инерации по самому списку?

pawnhearts ★★★★★
()
Ответ на: комментарий от pawnhearts

Мешает pickle, который не умеет во вложенные функции

pickle.PicklingError: Can't pickle <function func_1.<locals>.func_inner at 0x7f81adad1b70>: attribute lookup func_inner on forks failed

Qwentor ★★★★★
() автор топика
Последнее исправление: Qwentor (всего исправлений: 1)
Ответ на: комментарий от anonymous

Короче, анонимус, тебе спасибо. Переделал это под синтаксис Python 3.4 и все работает

Qwentor ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.