У мене є сценарій, який успішно виконує набір завдань багатопроцесорного пулу із imap_unordered()
викликом:
p = multiprocessing.Pool()
rs = p.imap_unordered(do_work, xrange(num_tasks))
p.close() # No more work
p.join() # Wait for completion
Однак моя num_tasks
- близько 250 000, і тому join()
блокує основний потік приблизно на 10 секунд, і я хотів би мати можливість поступово лунати до командного рядка, щоб показати, що основний процес не заблокований. Щось на зразок:
p = multiprocessing.Pool()
rs = p.imap_unordered(do_work, xrange(num_tasks))
p.close() # No more work
while (True):
remaining = rs.tasks_remaining() # How many of the map call haven't been done yet?
if (remaining == 0): break # Jump out of while loop
print "Waiting for", remaining, "tasks to complete..."
time.sleep(2)
Чи існує метод для об'єкта результату або самого пулу, який вказує кількість завдань, що залишилися? Я спробував використати multiprocessing.Value
об'єкт як лічильник ( do_work
викликає counter.value += 1
дію після виконання свого завдання), але лічильник досягає лише ~ 85% від загального значення, перш ніж припиняти збільшення.