【发布时间】: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