Производитель использует счетчик pro_count для отслеживания количества элементов. в буфере. Когда производитель добавляет элемент в буфер, он увеличивает pro_count и уведомляет потребителя через выходной канал. Потребитель после потребления элемента уменьшает pro_count и информирует об этом производителя через notify_pipe. Если pro_count достигает размера буфера или превышает его, производитель должен дождаться, пока потребитель освободит пространство, потребляя элементы, прежде чем добавлять новые в буфер.
Потребитель использует счетчик con_count для отслеживания количество элементов в буфере. Когда производитель добавляет элемент в буфер, он увеличивает con_count и уведомляет потребителя через выходной канал. Потребитель потребляет элементы, уменьшает con_count и информирует производителя через notify_pipe. Если con_count достигает нуля, буфер пуст, и потребитель должен дождаться, пока производитель добавит элементы, прежде чем продолжить потребление.
когда производитель ожидает из-за полного буфера, а потребитель ожидание из-за пустого буфера, оно должно не только отображаться в терминале, но и фактически ждать в системе.
эта программа также должна отображать три условия.
Одним из них является то, что производитель и потребитель работают одновременно, и это можно реализовать с помощью сна. раз (например, оба должны быть 1).
другое условие состоит в том, что фактически происходит полный буфер, и производитель ждет, пока будет реализовано то, что время ожидания производителя будет слишком большим. меньше, чем время сна потребителя (время сна производителя: 0,01, время сна потребителя: 1)
и другое условие заключается в том, что фактически должен произойти пустой буфер, что, я полагаю, может быть похоже на это: (время сна производителя: 1, время сна потребителя: 0.01).
Я написал следующий код, но проблема в том, что он не работает и ничего не показывает в терминале. Я думаю, что моя логика верна, и я много искал, в чем проблема, но так и не смог ее исправить. код:
'''
Код: Выделить всё
from multiprocessing import Process, Pipe, Lock, Condition
import time
import random
# Define buffer size and shared buffer
buffer_size = 30
buffer = []
def create_items(pipe_1, notify_pipe, lock, condition):
output_pipe = pipe_1[1]
notify_conn = notify_pipe[0]
pro_counter = 0
for _ in range(100):
item = random.randint(0, 1000)
# Producer waits if buffer is full
with condition:
while pro_counter >= buffer_size: # Wait until there's space in the buffer
print("Producer waiting: Buffer full.")
condition.wait() # Wait for consumer to consume an item
#Add the item to the buffer
with lock:
buffer.append(item)
pro_counter += 1
print(f"Producer: Producing {item}")
output_pipe.send("produced") # Notify consumer an item was produced
# Notify consumer that an item was produced
#condition.notify_all()
# Process acknowledgments from the consumer
while notify_conn.poll():
ack = notify_conn.recv()
if ack == "consumed":
pro_counter -= 1
time.sleep(0.01) # Simulate some delay
# Signal the consumer that production is complete
output_pipe.send(None)
output_pipe.close()
def consume_items(pipe_1, notify_pipe, lock, condition):
input_pipe = pipe_1[0]
notify_conn = notify_pipe[1]
con_counter = 0
while True:
ack = input_pipe.recv()
if ack == "produced":
con_counter += 1
with condition:
while con_counter
Подробнее здесь: [url]https://stackoverflow.com/questions/79326360/producer-consumer-problem-using-multiprocessing-in-python[/url]
Мобильная версия