使用多处理显示控制台进度条

displaying console progressbars with multiprocesing

我有一个正在改进的建模应用程序,但在跨多个线程获取实时进度条更新时遇到问题。

每个模型工作单元都映射到一个处理器:

Class Main():
   def run(self):
        s1 = datetime.now()
        p = mp.Pool(mp.cpu_count(), maxtasksperchild=1)
        p.map(self.solve_one_cochlea, self.cochlear_list)
        p.close()
        p.join()            
        print("simulation of {} channels finished in {:0.3f}s".format(self.channels,timedelta.total_seconds(datetime.now()-s1)))

solve_one_cochlea 中,调用了大计算循环。平均而言,完成该循环的所有 7000 次迭代每个线程大约需要 45-90 秒:

import progressbar
 Class Worker:
      def long_running_solve:
           with progressbar.ProgressBar(max_value=7000, redirect_stdout=True) as bar:
                for j in range(7000):
                   #heavy linear algebra here
                   bar.update(j)

这一切都很好,但发生的事情是,我没有得到两个或更多实时更新的进度条,而是 突然solve_one_cochlea 所有 个实例完成时出现,就在 run 中最后的 print() 之前。这种打败了重点。

更改此代码流以便我的进度条动态更新控制台的好方法是什么?

https://github.com/aaren/multi_progress 做我想做的事。

这在 PyCharm 控制台中有一些非常奇怪的输出 运行,但在真实终端中运行良好。