【问题标题】:flask-socketio emit from background task does't emit从后台任务发出的flask-socketio不会发出
【发布时间】:2020-06-11 02:24:52
【问题描述】:

下面是我的代码 sn-p,我正在运行一个后台任务,并希望在事件被调用时发出 id。

manage.py

from threading import Lock 

continue_reading = True
thread = None
thread_lock = Lock()

socketio = SocketIO(app, cors_allowed_origins='*', logger=True, engineio_logger=True, **params)

def background_task(app):
    with app.app_context():
        while continue_reading:
            id = setup_rfidreader() 
            logging.debug("chip id from bg {}".format(id)) 
            socketio.emit('chip was readed', {"timestamp": id} )

@socketio.on('read_card')
def handle_read_card_event(): 
    global thread
    with thread_lock:
        if thread is None:
            thread = socketio.start_background_task(background_task, current_app._get_current_object())

后台任务阻止调用其他事件,为什么?

def setup_rfidreader():
    reader = SimpleMFRC522()
    print("Hold a tag near the reader")
    try:
        id, text = reader.read()
        sleep(.5)
        print(id)
        return id
    except KeyboardInterrupt:
        print('interrupted')
    finally:
        GPIO.cleanup()

【问题讨论】:

  • 你用的是eventlet还是gevent?如果是,您可能需要检查 setup_rfidreader() 是否兼容。根据您的描述,该函数可能是一个阻塞函数。
  • 我正在使用 eventlet。我已经用 setup_rfidreader() 代码更新了问题。
  • 好的,setup_rfidreader() 做什么?它会阻塞吗?
  • 它基本上从 rpi GPIO 读取芯片 ID (rfid)。它不会阻止任何东西
  • 我也应该包含一个redis队列吗?它是否考虑从外部进程发出?我无法从文档中弄清楚

标签: python flask-socketio python-socketio


【解决方案1】:

好像eventlet和redis url没有配置好。

【讨论】: