У производителя есть pro_count.
Это счетчик, который подсчитывает количество элементов в буфере.
Когда производитель создает элемент, он помещает этот элемент в буфер и через выходной канал уведомляет потребителя о том, что он создал элемент.
Затем добавляется 1 в pro_count, потому что один элемент помещается в буфер.
Здесь есть еще один канал — notify_pipe, и потребитель уведомляет производителя через этот канал о том, что он израсходовал элемент и когда элемент израсходован. это означает, что один элемент выталкивается из буфера, поэтому из pro_count будет вычтена 1.
Если pro_count равен или превышает значение buffer_size, это означает, что буфер заполнен, и он должен ждать, пока потребитель потребляет немного элемент из буфера, а затем у него появляется емкость, а затем производитель может поместить элемент в буфер.
На стороне потребителя у потребителя есть con_count.
Это счетчик, который подсчитывает количество элементов в буфере.
Когда производитель создает элемент, он помещает этот элемент в буфер и через выходной канал уведомляет потребителя о том, что он создал элемент.
Затем к con_count, потому что один элемент помещается в буфер.
Здесь есть еще один канал — notify_pipe, и потребитель уведомляет производителя через этот канал о том, что он израсходовал элемент, и когда элемент израсходован, он означает, что один элемент извлекается из буфера, поэтому из con_count будет вычтена 1.
Если 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]
Мобильная версия