擅长:python、mysql、java
<p>据我所知,没有什么不严密的方法,但是如果您使用<code>Pool.imap_unordered()</code>函数而不是map_async,那么您可以截取已处理的元素。</p>
<pre><code>import multiprocessing
import time
process_count = 4
def mytask(num):
print('Started task, sleeping %s' % num)
time.sleep(num)
# Actually, you should return the job you've created here.
return num
pool = multiprocess.Pool(process_count)
jobs = []
items = [1,2,3,4,5,3,2,3,4,5,2,3,2,3,4,5,6,4]
job_count = 0
for job in pool.imap_unordered(mytask, items):
jobs.append(job)
job_count += 1
incomplete = len(items) - job_count
unsubmitted = max(0, incomplete - process_count)
print "Jobs incomplete: %s. Unsubmitted: %s" % incomplete, unsubmitted
pool.close()
</code></pre>
<p>我要减去<code>process_count</code>,因为您几乎可以假设所有进程都将处理,但有两个例外:1)如果使用迭代器,则可能没有其他项可供使用和处理,2)您可能只剩下不到4个项。我没有为第一个异常编写代码。但如果你需要的话,这样做应该很容易。无论如何,你的例子使用了一个列表,所以你不应该有这个问题。</p>
<p>编辑:我也意识到你在使用While循环,这使得它看起来像是你在尝试周期性地更新一些东西,比如说,每半秒或者其他什么东西。我作为示例给出的代码不会这样做。我不确定那是不是个问题。</p>