Producer-Consumer-Problem bei der Verwendung von Multiprocessing in PythonPython

Python-Programme
Guest
 Producer-Consumer-Problem bei der Verwendung von Multiprocessing in Python

Post by Guest »

Ich versuche, dieses Problem mithilfe von Multiprocessing und Pipe als Kommunikationsstrategie zwischen Prozessen mithilfe der folgenden Methode zu implementieren:
Der Produzent verwendet einen Zähler, pro_count, um die Anzahl der Elemente zu verfolgen in einem Puffer. Wenn der Produzent dem Puffer ein Element hinzufügt, erhöht er pro_count und benachrichtigt den Verbraucher über eine Output_Pipe. Wenn der Verbraucher einen Artikel konsumiert, verringert er pro_count und informiert den Produzenten über eine notify_pipe. Wenn pro_count die Größe des Puffers erreicht oder überschreitet, muss der Produzent warten, bis der Verbraucher durch den Verbrauch von Elementen Platz schafft, bevor er weitere zum Puffer hinzufügt.
Der Verbraucher verwendet einen Zähler, con_count, um dies zu verfolgen Anzahl der Elemente im Puffer. Wenn der Produzent dem Puffer ein Element hinzufügt, erhöht er con_count und benachrichtigt den Verbraucher über eine Output_Pipe. Der Verbraucher verbraucht Elemente, verringert con_count und informiert den Produzenten über eine notify_pipe. Wenn con_count Null erreicht, ist der Puffer leer und der Verbraucher muss warten, bis der Produzent Elemente hinzufügt, bevor er mit dem Konsum fortfährt.
wenn der Produzent aufgrund des vollen Puffers wartet und der Verbraucher bereits Wenn sie aufgrund eines leeren Puffers warten, muss dies nicht nur im Terminal angezeigt werden, sondern sie müssen auch tatsächlich im System warten.
Dieses Programm muss außerdem drei Bedingungen anzeigen.
Einer ist, dass der Produzent und der Verbraucher gleichzeitig arbeiten, was wir mit close implementieren können Ruhezeiten (wie beide 1 sein sollen).
Die andere Bedingung ist, dass der Puffer tatsächlich voll ist und der Produzent darauf wartet, dass die Ruhezeit des Produzenten erreicht wird viel kürzer als die Ruhezeit des Verbrauchers ( Ruhezeit des Produzenten: 0,01, Ruhezeit des Verbrauchers: 1)
und die andere Bedingung ist, dass der leere Puffer tatsächlich auftreten muss, was meiner Meinung nach der Fall sein kann so: ( Schlafzeit des Produzenten: 1 , Schlafzeit des Verbrauchers : 0.01).
Ich habe den folgenden Code geschrieben, aber das Problem ist, dass er nicht funktioniert und im Terminal nichts angezeigt wird. Ich denke, meine Logik war richtig und ich habe viel gesucht, um herauszufinden, wo das Problem liegt, aber ich konnte es immer noch nicht beheben. der Code:
'''

Code: Select all

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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post