Python - 我可以为此目的使用blinker库吗?

时间:2017-10-08 22:44:51

标签: python flask blinker

我想知道我是否可以使用blinker库(或者可能使用任何库)来完成这些工作。

  1. 我使用Flask运行Web应用程序,在此应用程序中(可能是app.py),我定义了一个名为已更新的信号(例如blinker.signal('updated'))。
  2. 在一个单独的过程中,我将任何函数(我称之为subscriber)连接(订阅)到更新的信号。这个过程像守护进程一样永远运行。
  3. 每当在网络端发生更新时,我希望调用subscriber函数。
  4. 所以我写了一些代码:

    app.py (Flask应用程序)

    from flask import Flask
    from blinker import signal
    
    app = Flask(__name__)
    updated = signal('updated')
    
    @app.route('/update')
    def update():
        updated.send('nothing')
        return 'Updated!'
    

    background.py

    import time
    
    from app import updated
    
    @updated.connect
    def subscriber(*args, **kwargs):
        print('An update occurred on the web side!')
    
    while True:
        print('Waiting for signals...')
        time.sleep(1)
    

    使用flask run命令运行Web应用程序。现在,当我访问localhost:5000/update时,我可以在浏览器中看到Updated!消息但我无法从其他进程看到消息An update occurred on the web side!

    我的方法有误吗?如果是的话,我该怎么办?等待你的回答,谢谢。

1 个答案:

答案 0 :(得分:1)

Blinker的描述is

  

快速Python 进程内信号/事件调度系统。

强调我的,所以不能不使用库在两个进程之间发送信号。

你能做什么呢?好吧,Python标准库的文档有一章关于Interprocess Communication and Networking。目前尚不清楚您要构建的是什么,但如果您需要构建任务队列(使用“工作人员”),请尝试CeleryTaskTiger。如果您确实需要在进程之间实际发送消息,那么更复杂的内容(如ZeroMQ)将是合适的。