Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多处理:每个任务的进度条_Python_Multiprocessing - Fatal编程技术网

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)