2015-10-10 5 views
3

Итак, у меня есть этот код для производителей и потребителей;Производители и потребители - несколько потоков в Python

import threading 

import time 

import random 

N = 8 


buffer = N * [None] 

free = threading.Semaphore(N) 

items = threading.Semaphore(0) 

def prod(): 

    n = 0 
    i = 0 
    while True: 
     time.sleep(random.random()) 
     free.acquire() 
     buffer[i] = n 
     i = (i + 1) % N 
     n += 1 
     items.release() 

def cons(): 

    i = 0 
    while True: 
     time.sleep(random.random()) 
     items.acquire() 
     print(buffer[i]) 
     i = (i + 1) % N 
     free.release() 

def main(): 

    p = threading.Thread(target=prod, args=[]) 
    c = threading.Thread(target=cons, args=[]) 
    p.start() 
    c.start() 
    p.join() 
    c.join() 

main() 

Но я хочу иметь три потока для производителя и потребителя. Может кто-то предложить способ, которым я мог бы это сделать, используя третий семафор? Благодарю.

ответ

1

Предполагая, что это не домашнее задание о семафорах, и вы хотите получить реальное решение, вы должны использовать объект Queue, который может обрабатывать все это отдельно. Если я правильно понял, вы хотите, чтобы три производителя и три потребителя делили один буфер, который может содержать не более 8 элементов. Если это так, то код может быть упрощен к чему-то вроде этого:

import threading 
import Queue 

def prod(queue): 
    n = 0 
    while True: 
     time.sleep(random.random()) 
     queue.put(n) 
     n += 1 

def cons(queue): 
    while True: 
     time.sleep(random.random()) 
     n = queue.get() 
     print n 

def main(): 
    N = 8 
    queue = Queue.Queue(N) 
    threads = [] 
    for i in range(3): 
     threads.append(threading.Thread(target=cons, args=[queue]))) 
     threads.append(threading.Thread(target=prod, args=[queue]))) 
    for thread in threads: 
     thread.start() 
    for thread in threads: 
     thread.join() # this will never really finish, because the threads run forever 

Если вас интересует, как очередь реализуется внутри, вы можете увидеть исходный код here.

+0

Спасибо за помощь, но это для задания, и я должен написать его с третьим семафором мьютексов. Не могли бы вы также показать мне, что это написано именно так? – JoC5

Смежные вопросы