【发布时间】:2014-09-06 09:36:11
【问题描述】:
在使用多处理池的 apply_sync 方法时,我试图了解幕后发生的事情。
谁运行回调方法?是调用apply_async的主进程吗?
假设我发送了一大堆带有回调的 apply_async 命令,然后继续执行我的程序。当 apply_async 开始到结束时,我的程序仍在做事。当主进程仍在忙于脚本时,回调如何运行我的“主进程”?
这是一个例子。
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 使用 arg 0 运行 func
PoolWorker-2 使用 arg 1 运行 func
PoolWorker-3 使用 arg 2 运行 func
MainProcess 将要休眠一分钟
PoolWorker-4 使用 arg 3 运行 func
PoolWorker-1 使用 arg 4 运行 func
PoolWorker-2 使用 arg 5 运行 func
PoolWorker-3 使用 arg 6 运行 func
PoolWorker-4 使用 arg 7 运行 func
MainProcess 运行回调,参数为 0
MainProcess 使用 arg 1 运行回调
MainProcess 使用 arg 2 运行回调
MainProcess 使用 arg 3 运行回调
MainProcess 使用 arg 4 运行回调
PoolWorker-1 使用 arg 8 运行 func
...
完成脚本
MainProcess 如何在 while 循环中间运行回调??
multiprocessing.Pool 的文档中有关于回调的声明,这似乎是一个提示,但我不明白。
apply_async(func[, args[, kwds[, callback]]])
apply() 方法的变体,它返回一个结果对象。
如果指定了回调,那么它应该是一个接受单个参数的可调用对象。当结果准备就绪时,将对其应用回调(除非调用失败)。回调应该立即完成,否则处理结果的线程将被阻塞。
【问题讨论】:
标签: python callback parallel-processing multiprocessing