Python 如何判断apply_async函数是否已启动或是否已启动';s仍在多处理的队列中。池
我正在使用python的multiprocessing.Pool和apply_async来调用一系列函数 如何判断某个函数是否已由池成员开始处理,或者它是否处于队列中 例如:Python 如何判断apply_async函数是否已启动或是否已启动';s仍在多处理的队列中。池,python,parallel-processing,python-multiprocessing,Python,Parallel Processing,Python Multiprocessing,我正在使用python的multiprocessing.Pool和apply_async来调用一系列函数 如何判断某个函数是否已由池成员开始处理,或者它是否处于队列中 例如: import multiprocessing import time def func(t): #take some time processing print 'func({}) started'.format(t) time.sleep(t) pool = multiprocessing.P
import multiprocessing
import time
def func(t):
#take some time processing
print 'func({}) started'.format(t)
time.sleep(t)
pool = multiprocessing.Pool()
results = [pool.apply_async(func, [t]) for t in [100]*50] #adds 50 func calls to the queue
对于results
中的每个AsyncResult
,您可以调用ready()
或get(0)
查看函数是否已完成运行。但是,如何确定func是否已开始但尚未完成
i、 e.对于给定的AsyncResult对象(即给定的结果元素),是否有方法查看函数是否已被调用或是否位于池的队列中?首先,从结果列表中删除已完成的作业
results = [r for r in results if not r.ready()]
挂起的进程数是结果列表的长度:
pending = len(results)
挂起但未启动的数量是总挂起-池大小
not_started = pending - pool_size
池大小将是多处理的。如果像您一样使用默认参数创建池,则为cpu计数()
更新:
在一开始误解了这个问题之后,这里有一个方法来实现OP的要求
我怀疑可以将此功能添加到Pool类中而不会带来太多麻烦,因为AsyncResult是由带有队列的Pool实现的。该队列还可以在内部用于指示是否已启动
但这里有一种使用池和管道实现的方法。注意:这在Python2.x中不起作用——不知道为什么。在Python3.8中测试
import multiprocessing
import time
import os
def worker_function(pipe):
pipe.send('started')
print('[{}] started pipe={}'.format(os.getpid(), pipe))
time.sleep(3)
pipe.close()
def test():
pool = multiprocessing.Pool(processes=2)
print('[{}] pool={}'.format(os.getpid(), pool))
workers = []
for x in range(1, 4):
parent, child = multiprocessing.Pipe()
pool.apply_async(worker_function, (child,))
worker = {'name': 'worker{}'.format(x), 'pipe': parent, 'started': False}
workers.append(worker)
pool.close()
while True:
for worker in workers:
if worker.get('started'):
continue
pipe = worker.get('pipe')
if pipe.poll(0.1):
message = pipe.recv()
print('[{}] {} says {}'.format(os.getpid(), worker.get('name'), message))
worker['started'] = True
pipe.close()
count_in_queue = len(workers)
for worker in workers:
if worker.get('started'):
count_in_queue -= 1
print('[{}] count_in_queue = {}'.format(os.getpid(), count_in_queue))
if not count_in_queue:
break
time.sleep(0.5)
pool.join()
if __name__ == '__main__':
test()
这将获取挂起作业的总数。但是我想知道,
results[I]
当前是否正在运行(对于任何I
),或者它是否正在排队等待运行。@Alex是的,我误解了这个问题。我已经更新了一些代码,这些代码将跟踪哪些已启动,哪些在池队列中