Самый простой способ справиться с этим, вероятно, использовать pool.apply_async
для отправки ваших работ. Затем вам нужно определить обратный вызов, который будет выполняться каждый раз, когда задание выполнено.
Если вы хотите проинформировать пользователя о том, сколько заданий уже выполнено, обратному вызову требуется некоторая «память» о количестве выполненных заданий. Это может быть либо глобальная переменная, либо класс, который я считаю более предпочтительным.
Комбинируя эти точки, решение может выглядеть примерно так:
import multiprocessing
import time
class ProgressUpdater:
def __init__(self, num_items):
self.num_items = num_items
self.num_processed = 0
def update(self, data):
self.num_processed += 1
print(f"Done processing {self.num_processed} of {self.num_items} inputs")
def func(item):
time.sleep(item // 10)
return item // 2
if __name__ == "__main__":
item_list = [3, 5, 7, 32, 6, 21, 12, 1, 7]
progress_updater = ProgressUpdater(len(item_list))
with multiprocessing.Pool(3) as pool:
result_objects = [
pool.apply_async(func, (item,), callback=progress_updater.update)
for item in item_list
]
results = [result_object.get() for result_object in result_objects]
pool.join()
print(results)
Теперь, чтобы удовлетворить ваши потребности, вы нужно слегка помассировать, используя ваши partial
функции et c.