通常,每个进程都有自己的数据,而与其他每个进程无关。生成新进程(os.fork
在Unix上调用)会创建当前进程的副本。每个进程都获得自己的所有全局值的副本(例如pbar
)。每个进程的全局变量可以与其他进程中的变量共享相同的名称,但是每个进程可以拥有一个独立的值。
在您的情况下,您似乎只希望其中一个pbar
存在,并且对的所有调用update
都应更新该一个pbar
。因此pbar
,仅在一个进程中创建,然后使用Queue
将信号发送到该进程进行更新pbar
:
import multiprocessing as mp
SENTINEL = 1
def test(q):
for i in range(10000):
sleep(0.1)
q.put(SENTINEL)
def listener(q):
pbar = tqdm(total = 10000)
for item in iter(q.get, None):
pbar.update()
if __name__ == '__main__':
q = mp.Queue()
proc = mp.Process(target=listener, args=(q,))
proc.start()
workers = [mp.Process(target=test, args=(q,)) for i in range(5)]
for worker in workers:
worker.start()
for worker in workers:
worker.join()
q.put(None)
proc.join()