Python 多处理:每个任务的进度条
我有一个实现迭代算法的类。由于执行需要一段时间,并且我需要对多次执行的结果求平均值,因此我决定使用Python 多处理:每个任务的进度条,python,multiprocessing,Python,Multiprocessing,我有一个实现迭代算法的类。由于执行需要一段时间,并且我需要对多次执行的结果求平均值,因此我决定使用多处理。问题是,我希望每次执行都有一个进度条(或者一些不那么花哨的东西)。比如: experiment 1 [##########] 60% experiment 2 [#############] 70% experiment 3 [###] 20% 我的类是这样的(请注意,我已经使用了一个进度条,并且我希望它保持在那里,以便在我没有并行化时继续工作): 这是我的尝试: import multi
多处理
。问题是,我希望每次执行都有一个进度条(或者一些不那么花哨的东西)。比如:
experiment 1 [##########] 60%
experiment 2 [#############] 70%
experiment 3 [###] 20%
我的类是这样的(请注意,我已经使用了一个进度条,并且我希望它保持在那里,以便在我没有并行化时继续工作):
这是我的尝试:
import multiprocessing as mp
if __name__ == "__main__":
algo1 = Algo(200, 0,0, "test1")
pool = mp.Pool(processes=3)
for i in xrange(3):
pool.apply_async(algo1.run) # in real life run will be passed N arguments
pool.close()
pool.join()
有什么想法吗
PS:我试图避免在python 3中使用快速、肮脏的诅咒,但你会明白的;)
import multiprocessing as mp
if __name__ == "__main__":
algo1 = Algo(200, 0,0, "test1")
pool = mp.Pool(processes=3)
for i in xrange(3):
pool.apply_async(algo1.run) # in real life run will be passed N arguments
pool.close()
pool.join()
import random
import time
import multiprocessing
import os
import collections
class Algo(multiprocessing.Process):
def __init__(self, steps, name, status_queue):
multiprocessing.Process.__init__(self)
self.steps = steps
self.name = name
self.status_queue = status_queue
def step(self, step):
# Progress bar
self.status_queue.put((self.name, (step+1.0)/self.steps))
# Do some stuff
time.sleep(0.1)
def run(self):
for i in range(self.steps):
self.step(i)
def print_progress(progress):
# Windows:
os.system('cls')
for name, percent in progress.items():
percent = int(percent * 100)
bar = ('#' * int(percent/10)) + (' ' * (10 - int(percent/10)))
print("{}: [{}] {}%".format(name, bar, percent))
if __name__ == "__main__":
status = multiprocessing.Queue()
progress = collections.OrderedDict()
algos = [Algo(random.randrange(100, 200), "test" + str(i), status) for i in range(3)]
for a in algos:
a.start()
while any([a.is_alive() for a in algos]):
while not status.empty():
name, percent = status.get()
progress[name] = percent
print_progress(progress)
time.sleep(0.1)