Untitled
unknown
plain_text
2 years ago
2.6 kB
5
Indexable
import threading
import random
import time
# Define constants
ARRAY_SIZE = 10
NUM_PRODUCERS = 3
NUM_CONSUMERS = 3
TOTAL_PRODUCTIONS = 10000
# Shared resources
shared_array = [None] * ARRAY_SIZE
producers_activity_file = open("Producers_activity.txt", "w")
consumers_activity_file = open("Consumers_activity.txt", "w")
# Semaphores
mutex = threading.Semaphore(1) # Mutex for array access
full_sem = threading.Semaphore(0) # Items produced and ready to consume
empty_sem = threading.Semaphore(ARRAY_SIZE) # Empty slots in the array
# Function for producers
def producer(producer_id):
for production_number in range(1, TOTAL_PRODUCTIONS + 1):
# Produce item
value = random.randint(0, 10000)
# Enter critical section
empty_sem.acquire()
mutex.acquire()
# Write to array
index = shared_array.index(None)
shared_array[index] = value
# Write to file
producers_activity_file.write(f"Producer {producer_id} -- produced item {production_number} with the value {value}\n")
# Exit critical section
mutex.release()
full_sem.release()
producers_activity_file.close()
# Function for consumers
def consumer(consumer_id):
while True:
# Enter critical section
full_sem.acquire()
mutex.acquire()
# Read from array
index = shared_array.index(None, 0, ARRAY_SIZE)
if index == -1:
break # No more items to consume
value = shared_array[index]
shared_array[index] = None
# Write to screen
print(f"Consumer {consumer_id} -- consumed item {index + 1} with the value {value}")
# Write to file
consumers_activity_file.write(f"Consumer {consumer_id} -- consumed item {index + 1} with the value {value}\n")
# Exit critical section
mutex.release()
empty_sem.release()
consumers_activity_file.close()
# Create producer threads
producer_threads = []
for i in range(NUM_PRODUCERS):
thread = threading.Thread(target=producer, args=(i + 1,))
producer_threads.append(thread)
thread.start()
# Create consumer threads
consumer_threads = []
for i in range(NUM_CONSUMERS):
thread = threading.Thread(target=consumer, args=(i + 1,))
consumer_threads.append(thread)
thread.start()
# Wait for all producer threads to finish
for thread in producer_threads:
thread.join()
# Wait for all consumer threads to finish
for thread in consumer_threads:
thread.join()
Editor is loading...
Leave a Comment