Я пытаюсь понять немного о том, что происходит за кулисами при использовании метода apply_sync для многопроцессорного пула.
Кто запускает метод обратного вызова? Это основной процесс, называемый apply_async?
Скажем, я отправляю целую группу команд apply_async с обратными вызовами, а затем продолжаю свою программу. Моя программа все еще делает что-то, когда apply_async начинает заканчиваться. Как обратный вызов запускает мой "основной процесс", в то время как основной процесс все еще занят script?
Вот пример.
import multiprocessing
import time
def callback(x):
print '{} running callback with arg {}'.format(multiprocessing.current_process().name, x)
def func(x):
print '{} running func with arg {}'.format(multiprocessing.current_process().name, x)
return x
pool = multiprocessing.Pool()
args = range(20)
for a in args:
pool.apply_async(func, (a,), callback=callback)
print '{} going to sleep for a minute'.format(multiprocessing.current_process().name)
t0 = time.time()
while time.time() - t0 < 60:
pass
print 'Finished with the script'
Результат выглядит примерно так:
PoolWorker-1 работает func с arg 0
PoolWorker-2 работает func с arg 1
PoolWorker-3 работает func с arg 2
MainProcess собирается спать в течение минуты. Основной процесс занят.
PoolWorker-4 работает func с arg 3
PoolWorker-1 работает func с arg 4
PoolWorker-2 работает func с arg 5
PoolWorker-3 работает func с arg 6
PoolWorker-4 работает func с arg 7
MainProcess запускает обратный вызов с помощью arg 0 < - main обрабатывает обратный вызов, пока он все еще находится в цикле while.
MainProcess работает с обратным вызовом с помощью arg 1
MainProcess работает с обратным вызовом с arg 2
MainProcess работает с обратным вызовом с arg 3
MainProcess работает с обратным вызовом с arg 4
PoolWorker-1 работает func с arg 8
...
Закончено с помощью script
Как работает MainProcess с обратным вызовом, когда он находится в середине цикла while?
Это утверждение о обратном вызове в документации для multiprocessing.Pool, которое похоже на подсказку, но я этого не понимаю.
apply_async (func [, args [, kwds [, callback]]])
Вариант метода apply(), который возвращает объект результата.
Если обратный вызов указан, он должен быть вызываемым, который принимает один аргумент. Когда результат будет готов, к нему будет применен обратный вызов (если вызов не завершился). обратный вызов должен завершиться немедленно, так как иначе поток, обрабатывающий результаты, будет заблокирован.