在Python3'中,每当子进程结束时打印更新行;s多处理池
我正在使用Python的在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) 如何更新
多处理
库,通过内置的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)。