python - 如何等到信号

标签 python multithreading signals

我想做一个 while 循环等待并仅在收到信号时继续

例如在 while.py 中

        while queue:
             #wait until signal
             #bla bla

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

         def alarm():
             #trigger loop to continue

有办法吗?

最佳答案

您需要了解简单的生产者-消费者示例,( 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()

Explanation:

我们启动了一个生产者线程(以下简称生产者)和一个消费者线程(以下简称消费者)。 生产者不断添加到队列中,消费者不断从队列中移除。 由于队列是一个共享变量,我们将其保存在锁中以避免竞争条件。 在某个时候,消费者已经消费完所有东西而生产者还在 sleep 。消费者尝试消费更多,但由于队列为空,因此引发了 IndexError。 但是在每次执行时,在引发 IndexError 之前,您将看到打印语句告诉您“队列中没有任何内容,但消费者将尝试消费”,这解释了您收到错误的原因。

关于python - 如何等到信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44204316/

相关文章:

python - 使用具有奇怪输出的 Softmax 的神经网络

c - 处理信号后如何停止从键盘读取?

Android,使用超声波传输信号

python - Django 3 - 使模型的 FK 下拉列表仅显示当前用户的数据

python - 如何向另一台服务器发送请求并在 Pyramid View 中响应结果?

python - 从 MySQL 数据库递归获取所有子项

android - 如何在 ListView 项目上显示倒计时器?

linux - 是否可以在线程之间共享一个寄存器?

java - 如何 Autowiring Spring TaskExecutor 创建的线程?

linux - 将SIGINT从键盘发送到bash中的管道命令