Упорядоченные результаты с apply_async - PullRequest
0 голосов
/ 21 ноября 2018

Я прочитал, что функция apply_async не дает упорядоченных результатов.Если я повторял вызов функции, которая печатает квадраты списка чисел, я могу видеть на дисплее, что список не упорядочен.

Однако, когда функция возвращает число вместо его печати, и яиспользуйте .get(), чтобы получить значения, тогда я вижу, что результаты упорядочены.

У меня есть несколько вопросов -

  1. Почему упорядочены результаты из .get()?
  2. Если у меня есть цикл, который в качестве переменной называется a и его значение различно для разных итераций.Приведет ли использование apply_async к перезаписи значений a, поскольку он запускает процессы параллельно и асинхронно?
  3. Смогу ли я сэкономить вычислительное время, если запустить apply вместо apply_async?Мой код показывает, что apply медленнее, чем цикл for.Почему это так?
  4. Можем ли мы использовать функцию, объявленную в функции ___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]

1 Ответ

0 голосов
/ 21 ноября 2018
  1. Почему заказаны результаты по .get()?

, поскольку упорядочен список results.

Если у меня есть цикл, который в качестве переменной с именем a и его значением отличается для разных итераций.Будет ли использование apply_async причиной перезаписи значений a, поскольку он запускает процессы параллельно и асинхронно?

обычно нет, но я не могу сказать, не увидев код.

Смогу ли я сэкономить вычислительное время, если запустить apply вместо apply_async?Мой код показывает, что apply медленнее, чем цикл for.Почему это так?

нет, apply блоков при каждом вызове, параллелизма нет.apply медленнее из-за многопроцессорных издержек.

Можем ли мы использовать функцию, объявленную в функции ___main___, с apply_async?

yes для * nix, no для windows, потому что fork().

ваше измерение времени .apply_async неверно, вы должны взять t2a после result.get и не предполагать, что результат будет выполнен в следующем порядке:

while not all(r.ready() for r in results):
    time.sleep(0.1)

кстати, вашРабочая функция выполняется слишком быстро, чтобы завершить ее, сделайте больше вычислений, чтобы выполнить настоящий тест.

...