2015-10-10 63 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