如何加快flask-socketio Emit

时间:2019-07-18 07:12:44

标签: flask-socketio

我需要定期将来自opencv-python的已处理帧发送回nodejs前端。我正在使用flask-socketio在nodejs和opencv-python之间进行通信。

我可以通过在while循环的每次迭代结束时发出输出来获取输出。但是有延迟,我的fps不够好。

如何改善实时视频处理的FPS?

我尝试了flask-socketio的async_mode作为eventlet,它仅在我在发射行之后使用sleep时才为每个循环发射。睡眠会导致FPS进一步降低。在async_mode线程上,发射发生在每次循环迭代中而没有睡眠。与没有发射的FPS相比,它的FPS更好,但仍然要少得多。

vs = cv2.Videocapture(path)
while(vs.isOpened()):
     ret, fr = vs.read()
     //do some processing
     emit('frame', fr)

没有发射线,我可以达到55-60 FPS,但是发射时我几乎不能达到20 FPS。我该怎么做才能加快python和nodejs之间的通信

更新:添加requirements.txt

aiodine==1.2.6
aiohttp==3.5.4
altgraph==0.16.1
asgiref==3.1.2
async-timeout==3.0.1
attrs==19.1.0
bocadillo==0.16.1
certifi==2019.3.9
chardet==3.0.4
Click==7.0
cycler==0.10.0
dnspython==1.16.0
eventlet==0.25.0
Flask==1.0.3
Flask-SocketIO==4.1.0
future==0.17.1
greenlet==0.4.15
h11==0.8.1
idna==2.8
imutils==0.5.2
itsdangerous==1.1.0
Jinja2==2.10.1
kiwisolver==1.1.0
MarkupSafe==1.1.1
matplotlib==3.1.0
minidump==0.0.6
monotonic==1.5
multidict==4.5.2
nest-asyncio==1.0.0
netifaces==0.10.6
numpy==1.16.4
object-detection==0.1
opencv-contrib-python==4.0.1.24
opencv-python==3.4.2.17
pandas==0.24.2
pefile==2019.4.18
pudb==2019.1
Pygments==2.4.2
pyparsing==2.4.0
python-dateutil==2.8.0
python-engineio==3.8.1
python-multipart==0.0.5
python-socketio==4.1.0
pytz==2019.1
pywin32-ctypes==0.2.0
requests==2.22.0
six==1.12.0
starlette==0.12.0
tqdm==4.32.1
typesystem==0.2.2
urllib3==1.25.3
urwid==2.0.1
uvicorn==0.7.2
websockets==7.0
Werkzeug==0.15.4
whitenoise==4.1.2
yarl==1.3.0

1 个答案:

答案 0 :(得分:0)

不幸的是,将CPU密集型任务(例如您正在使用异步或多线程服务器进行的图像处理)组合在一起并不是一个好主意。

您建议在事件事件中,“睡眠”会使一切变慢。这只是部分正确。睡眠是在基于greenlet的进程中启用并发的唯一方法。所有的睡眠(假设您调用sleep(0))都是让其他任务共享CPU。问题在于,当其他任务运行时,带有视频循环的任务必须等待。

线程情况也可能会出现性能问题,但原因有所不同。在有多个线程的情况下,PIL(Python解释器锁)将确保一次仅一个线程执行Python代码。因此,在进行视频处理时,所有Socket.IO线程都会被阻止,反之亦然。

如果您真的想要真正的多任务处理,最好的解决方案是将视频处理工作移到与Socket.IO服务器分开的进程中。