此多处理代码按预期工作。它创建 4 个 Python 进程,并使用它们打印 0 到 39 之间的数字,每次打印后都有延迟。
import multiprocessing
import time
def job(num):
print num
time.sleep(1)
pool = multiprocessing.Pool(4)
lst = range(40)
for i in lst:
pool.apply_async(job, [i])
pool.close()
pool.join()
但是,当我尝试使用 multiprocessing.Lock 来防止多个进程打印到标准输出时,程序会立即退出而没有任何输出。
import multiprocessing
import time
def job(lock, num):
lock.acquire()
print num
lock.release()
time.sleep(1)
pool = multiprocessing.Pool(4)
l = multiprocessing.Lock()
lst = range(40)
for i in lst:
pool.apply_async(job, [l, i])
pool.close()
pool.join()
为什么引入一个 multiprocessing.Lock 会使这段代码不起作用?
更新:它在全局声明锁时起作用(我做了一些非确定性测试来检查锁是否有效),而不是上面将锁作为参数传递的代码(Python 的多处理文档显示锁被传递为参数)。下面的代码有一个全局声明的锁,而不是在上面的代码中作为参数传递。
import multiprocessing
import time
l = multiprocessing.Lock()
def job(num):
l.acquire()
print num
l.release()
time.sleep(1)
pool = multiprocessing.Pool(4)
lst = range(40)
for i in lst:
pool.apply_async(job, [i])
pool.close()
pool.join()
原文由 dannyadam 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果将
pool.apply_async
更改为pool.apply
,则会出现此异常:pool.apply_async
只是隐藏它。我不想这么说,但使用全局变量可能是您示例的最简单方法。让我们只希望 迅猛龙 不会抓到你。