如何等到信号

时间:2017-05-26 14:40:22

标签: python multithreading signals

我想做一个while循环等待,只有当它收到信号

时才继续

例如在while.py

        while queue:
             #wait until signal
             #bla bla

当我点击我的烧瓶服务器上的按钮时,它应该向此循环发送信号以继续:在main.py中

         def alarm():
             #trigger loop to continue

有办法吗?

1 个答案:

答案 0 :(得分:2)

您需要了解简单的生产者 - 消费者示例,(see source

from threading import Thread, Lock
import time
import random

queue = []
lock = Lock()

class ProducerThread(Thread):
    def run(self):
        nums = range(5) #Will create the list [0, 1, 2, 3, 4]
        global queue
        while True:
            num = random.choice(nums) #Selects a random number from list [0, 1, 2, 3, 4]
            lock.acquire()
            queue.append(num)
            print "Produced", num 
            lock.release()
            time.sleep(random.random())


class ConsumerThread(Thread):
    def run(self):
        global queue
        while True:
            lock.acquire()
            if not queue:
                print "Nothing in queue, but consumer will try to consume"
            num = queue.pop(0)
            print "Consumed", num 
            lock.release()
            time.sleep(random.random())


ProducerThread().start()
ConsumerThread().start()
  

说明:

我们启动了一个生产者线程(以下称为生产者)和一个消费者线程(以下称为消费者)。 生产者不断添加到队列中,并且消费者继续从队列中删除。 由于queue是一个共享变量,我们将其保持在锁定内以避免竞争条件。 在某些时候,消费者已经消耗了一切,生产者仍然在睡觉。消费者尝试消耗更多,但由于队列为空,因此会引发IndexError。 但是在每次执行时,在引发IndexError之前,你会看到print语句告诉"队列中没有任何内容,但消费者会尝试使用"这解释了为什么你会收到错误。