многопроцессорный.Пул: в чем разница между map async и imap?



Я пытаюсь узнать, как использовать в Python multiprocessing пакет, но я не понимаю разницы между map_async и imap.
Я заметил, что оба map_async и imap выполняются асинхронно. Так когда я должен использовать один над другим? И как я должен получить результат, возвращенный map_async?



должен ли я использовать что-то вроде этого?



def test():
result = pool.map_async()
pool.close()
pool.join()
return result.get()

result=test()
for i in result:
print i
530   1  

1 ответ:

есть два ключевых различия между imap/imap_unordered и map/map_async:

  1. то, как они потребляют iterable вы передаете им.
  2. то, как они возвращают результат обратно к вам.

map использует ваш iterable путем преобразования iterable в список (предполагая, что это еще не список), разбивая его на куски и отправляя эти куски рабочим процессам в Pool. Разбиение итерируемого на куски выполняет лучше, чем передача каждого элемента в iterable между процессами по одному элементу за раз - особенно если iterable большой. Тем не менее, превращение iterable в Список для его фрагментации может иметь очень высокую стоимость памяти, так как весь список необходимо будет хранить в памяти.

imap не превращает итерацию, которую вы даете ему в список, и не разбивает его на куски (по умолчанию). Он будет повторять итерацию по одному элементу за раз и отправлять их каждому рабочему процесс. Это означает, что вы не принимаете удар памяти преобразования всего iterable в список, но это также означает, что производительность медленнее для больших iterables, из-за отсутствия фрагментации. Это можно смягчить, передав

Comments

    Ничего не найдено.