Я прочитал, что функция apply_async
не дает упорядоченных результатов.Если я повторял вызов функции, которая печатает квадраты списка чисел, я могу видеть на дисплее, что список не упорядочен.
Однако, когда функция возвращает число вместо его печати, и яиспользуйте .get()
, чтобы получить значения, тогда я вижу, что результаты упорядочены.
У меня есть несколько вопросов -
- Почему упорядочены результаты из
.get()
? - Если у меня есть цикл, который в качестве переменной называется
a
и его значение различно для разных итераций.Приведет ли использование apply_async
к перезаписи значений a
, поскольку он запускает процессы параллельно и асинхронно? - Смогу ли я сэкономить вычислительное время, если запустить
apply
вместо apply_async
?Мой код показывает, что apply
медленнее, чем цикл for.Почему это так? - Можем ли мы использовать функцию, объявленную в функции
___main___
с apply_async
?
Вот небольшой рабочий пример:
from multiprocessing import Pool
import time
def f(x):
return x*x
if __name__ == '__main__':
print('For loop')
t1f = time.time()
for ii in range(20):
f(ii)
t2f = time.time()
print('Time taken for For loop = ', t2f-t1f,' seconds')
pool = Pool(processes=4)
print('Apply async loop')
t1a = time.time()
results = [pool.apply_async(f, args = (j,)) for j in range(20)]
pool.close()
pool.join()
t2a = time.time()
print('Time taken for pool = ', t2a-t1a,' seconds')
print([results[hh].get() for hh in range(len(results))])
В результате получается:
Для цикла Время, необходимое для цикла For = 5.9604644775390625e-06 секунд
Применение асинхронного цикла Время, необходимое для пула = 0.10188460350036621 секунд
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361]