python - 如何在 Flask 中使用带有“start_background_task”的块功能?
问题描述
我正在使用 Flask 设置一个新服务器。它使用 flask_socketio 和 zmq 将图像从服务器推送到网络。我想使用 zmq.recv() 作为块函数。但是它会阻塞烧瓶。所有来自网络的消息都将被阻止。如何在烧瓶中使用块函数,没有 socketio.sleep()
我尝试将 zmq.NOBLOCK 设置为 zmq.recv()。然后添加 socketio.sleep(0.001)。它有效,但它非常难看。
这是我的代码。
ctx = zmq.Context()
sock = ctx.socket(zmq.ROUTER)
sock.bind("tcp://*:9988")
def recvThread():
while True:
img = sock.recv()
socketio.emit("frame", img)
if __name__ == '__main__':
init_zmq()
with thread_lock:
if thread is None:
socketio.start_background_task(target=recvThread)
socketio.run(app, host='0.0.0.0', port=5000)
是否有任何标志可以用于这种情况?
解决方案
我通过用 eventlet.green.zmq 替换 zmq 解决了这个问题。 参考
推荐阅读
- c++ - 从指针向量、二维指针数组中删除对象并在一个循环中释放其内存
- c - 当我有 AF_UNIX 的 socket() 时,为什么我需要 socketpair()?
- c# - 如何在 C# 控制台应用程序搜索功能中搜索 SQL Server 表?
- python - 在 Product/Inventory 类应用程序中获取 <__main__.Product at 0x7fdbcc6c4460>] 错误
- excel - 查找命名范围或命名对象
- python - 空输出文件,Detectron2
- excel - 使用 VBA 获取网站的 HTML 代码(不使用 Selenium)
- android - 'flutter pub get' 失败 - “所以,因为 fstore 依赖于来自 sdk 的 flutter_test any,版本解析失败。”
- c - 打印和处理具有特定字符编码的文件
- javascript - 客户端切换设备或在浏览器中打开新会话时,Firebase Cloud Messaging 的客户端 ID 是否更改