Answer

Answer

t.me/python_tesst

Ответ:

thread 1: order 0

thread 2: order 1

thread 2: order 2

thread 1: order 3

thread 1: order 4

thread 1: order 5

thread 1: order 6

thread 1: order 7

thread 1: order 8

thread 1: order 9

thread 1: stop

thread 2: stop

thread 3: stop

Объяснение:

В этом примере мы создаем функцию order_processor, которая может реализовывать в себе бизнес логику, например, обработку заказа. При этом, если она получает сообщение stop, то прекращает свое выполнение. В главном потоке мы создаем и запускаем три потока для обработки заказов. Запущенные потоки видят, что очередь пуста и “встают на блокировку” при вызове wait(). В главном потоке в очередь добавляются десять заказов и сообщения для остановки обработчиков, после этого вызывается метод notify_all() для оповещения всех заблокированных потоков о том, что данные для обработки есть в очереди.

Код:

from threading import Condition, Thread
from queue import Queue
from time import sleep
cv = Condition()
q = Queue()
# Consumer function for order processing
def order_processor(name):
  while True:
      with cv:
          # Wait while queue is empty
          while q.empty():
              cv.wait()
          try:
              # Get data (order) from queue
              order = q.get_nowait()
              print(f"{name}: {order}")
              # If get "stop" message then stop thread
              if order == "stop":                  
                  break
          except:
              pass
          sleep(0.1)
# Run order processors
Thread(target=order_processor, args=("thread 1",)).start()
Thread(target=order_processor, args=("thread 2",)).start()
Thread(target=order_processor, args=("thread 3",)).start()
# Put data into queue
for i in range(10):
  q.put(f"order {i}")
# Put stop-commands for consumers
for _ in range(3):
  q.put("stop")
# Notify all consumers
with cv:
  cv.notify_all()


Report Page