【发布时间】:2021-11-28 04:13:48
【问题描述】:
我想在multiprocessing.Pool 中有一个共享计数器,我使用以下代码打印不同的输入列表:
import multiprocessing
running = multiprocessing.Value('i', 0)
def f(x):
global running
global lock
# ... code ...
with lock:
running.value -= 1
print(f"Still running: {running.value}\n", end='', flush=True)
return x
if __name__ == '__main__':
lock = multiprocessing.Lock()
rangeval = range(100)
running.value = len(rangeval)
pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
result = pool.map(f, iterable=rangeval)
这在 Mac 和 Linux 中运行良好。但是当我在 Windows 中运行它时,它会产生一个错误:
File "C:\...\...\...\...\main.py", line 11, in f
with lock:
NameError: name 'lock' is not defined
当我将lock = multiprocessing.Lock() 放在if __name__ == '__main__' 之外的函数f 之上时,它会产生如下奇怪的输出:
Still running: -1
Still running: -2
Still running: -3
Still running: -4
Still running: -1
Still running: -2
Still running: -3
Still running: -4
如何在 Windows 中解决这个问题?
【问题讨论】:
-
您尝试过
lock = None外主要吗?然后你将它分配到 main. -
是的,它在函数
f中再次产生错误,如with lock: AttributeError: __enter__。我把lock = None放在函数f之前
标签: python python-3.x multithreading parallel-processing multiprocessing