我曾经使用这个片段来监控多进程的进度。不过,现在 q.qsize(( 停止工作,只返回零。有没有替代q.qsize()
以前做的事情?或者有更好的方法吗?
from multiprocessing import Pool, Manager, cpu_count
def process(args):
'''
Pickleable function for (parallel) processing.
Expects a dictionary with keys:
Mandatory:
- 'filename': 'path to file to be processed',
...
Optional:
- 'queue': instance of multiprocessing.Manager().Queue()
'''
filename = args['filename']
mode = args['mode']
if 'queue' in args.keys():
q = args['queue']
q.put('filename')
return do_something_with(filename)
...
pool = Pool(processes=nthreads)
m = Manager()
q = m.Queue()
# prepare args...
results = pool.map_async(process, args)
# monitor progress
while True:
if results.ready():
break
else:
size = q.qsize()
self.progress = int(100 * (size / self.n_files))
time.sleep(1)
self.progress = 100
看起来您正在混淆池和队列。多处理 Pool 类为您处理排队逻辑,但 Pool 不是队列对象,而是池。因此,当您检查队列大小时,那里根本没有任何东西。
但是,要直接回答您的问题,您的q.qsize()
始终为 0,因为您实际上并没有将任何内容排队到队列中。您的队列始终为空。您需要在队列中q.put()
某些内容,如果这是您要查找的行为。
我所知道的任何东西都不会完全适用于您的代码,就像您现在使用pool.map_async
一样。我不确定您想如何从这里开始处理它,但是有很多关于检查池中还剩下多少项目的问题。