- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
过去几天,我一直在尝试将事件流集成到我的 Flask 应用程序中,在我的本地测试中取得了不错的结果,但在我的服务器上使用 uWSGI 运行该应用程序时却有些糟糕。我的代码基本上建立在 example 之上从 flask 。我正在使用 python 3.4.2
。
当在我的 uWSGI 服务器上运行应用程序时,它会引发 gevent.hub.LoopExit: 'This operation would block forever'.
每当客户端尝试连接到 /streaming
端点。我的假设是,这是由于无限期地在空队列上调用 get()
造成的。
完整回溯:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/werkzeug/wsgi.py", line 691, in __next__
return self._next()
File "/usr/lib/python3/dist-packages/werkzeug/wrappers.py", line 81, in _iter_encoded
for item in iterable:
File "./voting/__init__.py", line 49, in gen
result = queue.get(block=True)
File "/usr/local/lib/python3.4/dist-packages/gevent/queue.py", line 284, in get
return self.__get_or_peek(self._get, block, timeout)
File "/usr/local/lib/python3.4/dist-packages/gevent/queue.py", line 261, in __get_or_peek
result = waiter.get()
File "/usr/local/lib/python3.4/dist-packages/gevent/hub.py", line 878, in get
return self.hub.switch()
File "/usr/local/lib/python3.4/dist-packages/gevent/hub.py", line 609, in switch
return greenlet.switch(self)
gevent.hub.LoopExit: ('This operation would block forever', <Hub at 0x7f717f40f5a0 epoll default pending=0 ref=0 fileno=6>)
/streaming
端点:
@app.route("/streaming", methods=["GET", "OPTIONS"])
def streaming():
def gen():
queue = Queue()
subscriptions.add_subscription(session_id, queue)
try:
while True:
result = queue.get() # Where the Exception is raised
ev = ServerSentEvent(json.dumps(result["data"]), result["type"])
yield ev.encode()
except GeneratorExit: # TODO Need a better method to detect disconnecting
subscriptions.remove_subscription(session_id, queue)
return Response(gen(), mimetype="text/event-stream")
向队列中添加一个事件:
def notify():
msg = {"type": "users", "data": db_get_all_registered(session_id)}
subscriptions.add_item(session_id, msg) # Adds the item to the relevant queues.
gevent.spawn(notify)
如前所述,它在本地使用 werkzeug
运行良好:
from app import app
from gevent.wsgi import WSGIServer
from werkzeug.debug import DebuggedApplication
a = DebuggedApplication(app, evalex=True)
server = WSGIServer(("", 5000), a)
server.serve_forever()
使用 monkey.patch_all()
进行猴子修补。
从 Queue
切换到 JoinableQueue
。
gevent.sleep(0)
结合 Queue.get()
。
最佳答案
该异常基本上意味着在该循环/线程中没有其他正在运行的 greenlet 可以切换到。因此,当 greenlet 进入阻塞状态(queue.get())时,hub 无处可去,无事可做。
相同的代码可以在 gevent 的 WSGIServer 中运行,因为服务器本身是一个运行 socket.accept 循环的 greenlet,所以总是有另一个 greenlet 可以切换到。但显然 uwsgi 不是那样工作的。
解决此问题的方法是安排其他 greenlet 运行。例如,不是生成一个 greenlet 来按需通知,而是安排这样一个 greenlet 已经在运行并阻塞在它自己的队列上。
关于python - 使用 gevent.queue.Queue.get() : gevent. hub.LoopExit: 'This operation would block forever',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41198276/
在使用 Websockets 运行我的 Flask 应用程序时,我总是遇到这个错误。我已尝试遵循本指南 - http://blog.miguelgrinberg.com/post/easy-webso
我在程序中使用python 2.7和zerorpc以及线程。当我通过Thread对象中的zerorpc调用远程函数时,出现了异常“LoopExit:此操作将永远阻止”。 我的代码示例: class R
在我的代码中(https://github.com/chembl/chembl_webresource_client/blob/master/chembl_webresource_client/web
过去几天,我一直在尝试将事件流集成到我的 Flask 应用程序中,在我的本地测试中取得了不错的结果,但在我的服务器上使用 uWSGI 运行该应用程序时却有些糟糕。我的代码基本上建立在 example
我是一名优秀的程序员,十分优秀!