擅长:python、mysql、java
<p>我想出了下面的异步调用解决方案。</p>
<p>小玩具脚本的例子,但应该广泛应用我认为。</p>
<p>基本上,在无限循环中,在列表生成器中轮询结果对象的ready值,然后求和以计算剩余的已调度池任务数。</p>
<p>一旦没有剩余的break和join()&close()。</p>
<p>根据需要添加睡眠循环。</p>
<p>与上述解决方案相同的原理,但没有队列。如果还跟踪最初发送池的任务数,则可以计算完成百分比等。。。</p>
<pre><code>import multiprocessing
import os
import time
from random import randrange
def worker():
print os.getpid()
#simulate work
time.sleep(randrange(5))
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=8)
result_objs = []
print "Begin dispatching work"
task_count = 10
for x in range(task_count):
result_objs.append(pool.apply_async(func=worker))
print "Done dispatching work"
while True:
incomplete_count = sum(1 for x in result_objs if not x.ready())
if incomplete_count == 0:
print "All done"
break
print str(incomplete_count) + " Tasks Remaining"
print str(float(task_count - incomplete_count) / task_count * 100) + "% Complete"
time.sleep(.25)
pool.close()
pool.join()
</code></pre>