如何在python中通过多进程使用tqdm?
How to use tqdm through multi process in python?
我正在尝试通过多进程使用 tqdm
。并且行为不符合预期。我认为关键是 pbar
的值不会通过进程更新。那么如何处理这个问题呢?我也试过用Value
手动更新pbar.n
,还是失败了。似乎tqdm
不支持更新值和手动渲染。
def test(lock, pbar):
for i in range(10000):
sleep(0.1)
lock.acquire()
pbar.update()
lock.release()
pbar = tqdm(total = 10000)
lock = Lock()
for i in range(5):
Process(target = test, args = (lock, pbar))
一般来说,每个进程都有自己的数据,独立于其他进程。
生成一个新进程(在 Unix 上调用 os.fork
)创建一个副本
当前进程。每个进程都获得自己的所有全局值的副本(例如
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()
我正在尝试通过多进程使用 tqdm
。并且行为不符合预期。我认为关键是 pbar
的值不会通过进程更新。那么如何处理这个问题呢?我也试过用Value
手动更新pbar.n
,还是失败了。似乎tqdm
不支持更新值和手动渲染。
def test(lock, pbar):
for i in range(10000):
sleep(0.1)
lock.acquire()
pbar.update()
lock.release()
pbar = tqdm(total = 10000)
lock = Lock()
for i in range(5):
Process(target = test, args = (lock, pbar))
一般来说,每个进程都有自己的数据,独立于其他进程。
生成一个新进程(在 Unix 上调用 os.fork
)创建一个副本
当前进程。每个进程都获得自己的所有全局值的副本(例如
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()