Проблема производителя-потребителя с использованием многопроцессорной обработки в PythonPython

Программы на Python
Ответить
Anonymous
 Проблема производителя-потребителя с использованием многопроцессорной обработки в Python

Сообщение Anonymous »

Я пытаюсь реализовать эту проблему, используя многопроцессорную обработку и канал в качестве стратегии связи между процессами, используя следующий метод:
У производителя есть 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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»