Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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
在Python3'中,每当子进程结束时打印更新行;s多处理池_Python_Python 3.x_Multiprocessing - Fatal编程技术网

在Python3'中,每当子进程结束时打印更新行;s多处理池

在Python3'中,每当子进程结束时打印更新行;s多处理池,python,python-3.x,multiprocessing,Python,Python 3.x,Multiprocessing,我正在使用Python的多处理库,通过内置的map()方法处理输入列表。以下是相关代码段: subp_pool = Pool(self.subprocesses) cases = subp_pool.map(self.get_case, input_list) return cases 要并行运行的函数是self.get\u case(),输入列表是input\u list 我希望以以下格式将进度提示打印到标准输出: Working (25/100 cases processed) 如何更新

我正在使用Python的
多处理
库,通过内置的
map()
方法处理输入列表。以下是相关代码段:

subp_pool = Pool(self.subprocesses)
cases = subp_pool.map(self.get_case, input_list)
return cases
要并行运行的函数是
self.get\u case()
,输入列表是
input\u list

我希望以以下格式将进度提示打印到标准输出:

Working (25/100 cases processed)

如何更新包含池的类中的局部变量,以便在子流程结束时,该变量将递增1(然后打印到标准输出)?

使用
多处理.map无法做到这一点,因为它在完成所有任务之前不会向主进程发出任何警报。但是,通过与
回调
关键字参数配合使用,可以获得类似的行为:

from multiprocessing.dummy import Pool
from functools import partial
import time

class Test(object):
    def __init__(self):
        self.count = 0
        self.threads = 4

    def get_case(self, x):
        time.sleep(x)

    def callback(self, total, x):
        self.count += 1
        print("Working ({}/{}) cases processed.".format(self.count, total))

    def do_async(self):
        thread_pool = Pool(self.threads)
        input_list = range(5)
        callback = partial(self.callback, len(input_list))
        tasks = [thread_pool.apply_async(self.get_case, (x,), 
                                         callback=callback) for x in input_list]
        return [task.get() for task in tasks]

if __name__ == "__main__":
    t = Test()
    t.do_async()
从get_case()方法调用print_data(),就完成了

from threading import Lock

Class A(object):

def __init__(self):
    self.mutex = Lock()
    self.count = 0

def print_data(self):
    self.mutex.acquire()
    try:
        self.count += 1
        print('Working (' + str(self.count) + 'cases processed)')
    finally:
        self.mutex.release()

如果您使用的是进程池而不是线程池,那么这将不起作用。为什么要使用
多处理.dummy
而不是
多处理
?@mittelmania您的代码引用的是线程,所以我假设您也在使用它们。请随意从我的示例中删除
.dummy
,它的工作原理应该完全相同(假设您使用的是问题中所述的Python3.x)。