【发布时间】:2019-04-10 14:49:30
【问题描述】:
我正在尝试在 greenlet 中接收 websocket 消息,但它似乎没有工作。我有这个代码:
import gevent
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
from geventwebsocket import WebSocketServer, WebSocketApplication, Resource
def recvWs(ws):
gevent.sleep(0)
recvedData = ws.receive()
rData = json.loads(recvedData)
print(rData)
def app(environ, start_response):
websocket = environ['wsgi.websocket']
while True:
gevent.spawn(recvWs,websocket)
gevent.sleep(0)
if __name__ == '__main__':
server = WSGIServer(("0.0.0.0", 80), app,handler_class=WebSocketHandler)
server.serve_forever()
并且运行时返回这个错误:
<Greenlet "Greenlet-0" at 0x23fa4306148:
recvWs(<geventwebsocket.websocket.WebSocket object at 0x0)> failed with
RuntimeError
还有:
line 197, in read_frame
header = Header.decode_header(self.stream)
我该如何解决这个问题?
【问题讨论】:
-
你把事情复杂化了。每个到 web 服务的连接都是它自己的异步线程。如果您通过 Web 连接生成新的 greenlet,则没有与该功能的连接,因此无法获取数据。您的代码中也没有 JSON 导入,所以不确定它是否会起作用。
-
@eatmeimadanish,我怎样才能轻松地从我的主代码中修改 websocket 对象/线程? “如果您通过网络连接生成新的greenlet,则与该功能没有连接,因此无法获取数据”,我不明白,您能详细说明吗?
标签: python websocket gevent greenlets