Привет! Для таких задач отлично подходят модули `queue` и `threading`. Вот пример, как можно заюзать их вместе:
Программный код:
import threading
import queue
import time
def worker(q):
while not q.empty():
item = q.get()
print(f'Обработка {item}')
time.sleep(1) # Симулируем долгую обработку
q.task_done()
q = queue.Queue()
for i in range(10):
q.put(i)
threads = []
for _ in range(2):
t = threading.Thread(target=worker, args=(q,))
t.start()
threads.append(t)
q.join()
for t in threads:
t.join()
Основной прикол этого кода – мы сначала заполняем очередь, а потом создаём воркеры, которые будут брать задачи из этой очереди и выполнять их. В конце ждём, пока все потоки завершатся. Залог успеха – правильно использовать `task_done()` и `join()`, чтобы не было затыков.