使用多处理显示控制台进度条
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 控制台中有一些非常奇怪的输出 运行,但在真实终端中运行良好。
我有一个正在改进的建模应用程序,但在跨多个线程获取实时进度条更新时遇到问题。
每个模型工作单元都映射到一个处理器:
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 控制台中有一些非常奇怪的输出 运行,但在真实终端中运行良好。