Нет воздухонепроницаемого способа, о котором я знаю, но если вы используете функцию Pool.imap_unordered()
вместо map_async, вы можете перехватывать обрабатываемые элементы.
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()
Я вычитаю process_count
,потому что вы можете в значительной степени предполагать, что все процессы будут обрабатываться с одним из двух исключений: 1) если вы используете итератор, возможно, не останется больше элементов для использования и обработки, и 2) у вас может быть меньше 4 элементов.Я не кодировал для первого исключения.Но это должно быть довольно легко сделать, если вам нужно.В любом случае, в вашем примере используется список, поэтому у вас не должно быть этой проблемы.
Редактировать: Я также понял, что вы используете цикл While, который создает впечатление, будто вы пытаетесь что-то периодически обновлять, скажем,, каждые полсекунды или что-то.Код, который я привел в качестве примера, не сделает это таким образом.Я не уверен, что это проблема.