Sra*_*raw 8 python multiprocessing python-3.x tqdm
我正试图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))
Run Code Online (Sandbox Code Playgroud)
通常,每个进程都有自己的数据,与其他进程无关.产生一个新进程(os.fork在Unix 上调用)会创建当前进程的副本.每个进程都获得自己的所有全局值的副本(例如
pbar).每个进程的全局变量可以与其他进程中的变量共享相同的名称,但每个进程可以包含一个独立的值.
在您的情况下,看起来您只想pbar存在一个,并且所有调用都
update应该更新那个pbar.因此pbar,只在一个进程中创建,并使用a 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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3063 次 |
| 最近记录: |