2012-03-07 59 views
1

在python程序中,我需要2个基于线程模块的线程。线程#1生成一些数据并将其放入缓冲区,线程#2应该处理缓冲区中的数据。使用线程模块在python中实现线程

所以我的伪代码是这样的: 线程1:

Thread#1 
while True: 
    Generate_Some_Data() 
    while flag==1: 
     pass() 
    Buffer_Address=Write_It_To_Buffer() 
    flag=1 


Thread#2 
while True: 
    while flag==0: 
     pass() 
    Process_Data(Buffer_Address) 
    flag=0 

(我们假设访问变量“标志”被雾化,用合适的锁)

我知道线程模块不并发。实质上,这意味着除非其中一个线程在某些外部条件(例如file-io或time.sleep)上不阻塞,否则无论任务如何,两个线程都将共享总处理时间。因此,根据我的理解,在上述配置中,大约一半的处理时间将浪费在“while flag”循环上。

所以,这里是我的问题:

  1. 我说得对在线程模块的我上面的期待/理解?在“标志”循环中浪费了总处理时间的一半吗?

  2. (如果我是对的)反正有没有完全摆脱“标志”循环?我试图找出另一个可以让线程在lock.acquire()方法中休眠的结构,但是,我找不到这样做的安全方法。 (当一个线程relases锁,没有quarantee其他线程将收购其同一个线程之前再次获取它)

回答

3

这听起来像the Queue module是你所需要的。

这会给你一个阻塞的FIFO队列。每当消费者线程从队列中获取某些内容时,如果内容中没有任何东西,它将阻塞,直到有东西变为可用,从而使生产者线程有时间产生某种东西。

如果您担心生产者线程占用所有计算周期,则可以对队列的大小设置限制。如果队列已满,并且生产者线程有一些要添加的内容,它将阻塞,直到消费者线程取出某些内容。

下面是一些伪代码:

import Queue 
q = Queue.Queue() 

# Producer thread 
while True: 
    data = generate_some_data() 
    q.put(data) 

# Consumer thread 
while True: 
    data = q.get() 
    process_data(data) 
+0

我也有一个跟进的问题。 python Queue是一个信号量概念的实现,它假定消费者线程是相同的。假设我有2个消费者线程,它们应该根据数据类型来处理队列中的数据。例如,让我们假设如果数据的类型为“int”,则消费者1必须处理它。如果它是“浮动”,则消费者2必须处理它。但是,如果它是“字符串”,那么消费者1和2都不应该处理数据。是否有任何编程范例对于实现这样的问题有用? – tantuni 2012-03-07 18:54:18

+1

@ user460153我只是为每个消费者制作一个单独的队列。 – Taymon 2012-03-07 20:05:15

+0

我认为“条件变量”是这个问题的一个更好的范例。所有消费者线程都等待主线程发出信号。在主线程发出信号后,每个消费者线程检查数据类型并决定是处理数据还是继续休眠。 – tantuni 2012-03-08 18:52:40