多重处理:每个助教的进度条

2024-09-22 10:29:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个实现迭代算法的类。由于执行需要一段时间,而且我需要对多次执行的结果求平均值,所以我决定使用multiprocessing。问题是我希望每次执行都有一个进度条(或者不那么花哨的东西)。比如:

experiment 1 [##########] 60%
experiment 2 [#############] 70%
experiment 3 [###] 20%

我的类看起来是这样的(请注意,我已经使用了一个进度条,并且我希望将其保留在那里,以便在没有并行化的情况下继续工作):

^{pr2}$

这是我的尝试:

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()

有什么想法吗?在

附言:我试图避免curses


Tags: run进度条inimport算法as情况mp
1条回答
网友
1楼 · 发布于 2024-09-22 10:29:05

又快又脏,在Python3中,但你会明白的;)

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)

相关问题 更多 >