python多处理星图progressbar

python多处理星图progressbar,python,multiprocessing,tqdm,Python,Multiprocessing,Tqdm,因为我的worker函数中需要几个参数,所以我使用starmap,但是如何显示TQM的进度呢 从itertools导入重复 来自多处理导入池 def func(i、a、b、c): 打印(i、a、b、c) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': 池=池(线程数) a、 b,c='a','b','c' 星图(func,zip(范围(100),重复(a),重复(b),重复(c))) pool.close() pool.join() 那么,我如何使用TQ

因为我的worker函数中需要几个参数,所以我使用starmap,但是如何显示TQM的进度呢

从itertools导入重复
来自多处理导入池
def func(i、a、b、c):
打印(i、a、b、c)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
池=池(线程数)
a、 b,c='a','b','c'
星图(func,zip(范围(100),重复(a),重复(b),重复(c)))
pool.close()
pool.join()

那么,我如何使用TQM来显示预压力呢?

您应该创建一个进程来监视其他进程传递的信号,并更新您的TQM。给你一个简单的例子:

from multiprocessing import Queue, Pool, Process

def listener(q, num):
    tbar = tdqm(total = num)
    for i in iter(q.get, None):
        tbar.update()
    tbar.close()

def worker(q):
    do something.
    queue.put(1)

if __name__ == "__main__":
    ....
    q.put(None)  #when you finish your work, put a None signal to finish the listener.

是否可以将函数更改为接收单个元组参数而不是多个元组参数?这将允许您使用
imap
而不是
starmap
,因此主进程可以循环输入结果以更新进度条。不幸的是,没有
istarmap
!如果只需要对一个无法修改的函数(例如,它来自库)执行此操作,则可以使用顶级定义的
def包装器(tup):func(*tup)
函数对其进行包装。您将发现一个添加了
.istarmap()
的补丁和一个带有
tqdm
的示例。答案应该更直接,与问题相关,并建议代码本身的更改。