无法初始化并发 websocket 连接 [eventlet, Flask, javascript]



我正在使用使用eventlet编写的Python编写的服务器端端点和用JavaScript编写的客户端起点来处理websockets:

var ws = new WebSocket("ws://192.168.1.25:16081/some_url");
ws.onopen = function()
{
console.log("Transmitting " + data)
ws.send(data)
};
ws.onmessage = function (evt)
{
console.log(evt.data)
// Do stuff with evt.data
};

还有 Python 代码:

import eventlet
eventlet.sleep()
from eventlet import wsgi
from eventlet import websocket
from eventlet.support import six
@websocket.WebSocketWSGI
def game_room(ws):
print(ws)
try:
while True:
time.sleep(1)
#Do stuff, some server-pushing
except Exception,e:
#Disconnect, do stuff
def dispatch(environ, start_response):
""" This resolves to the web page or the websocket depending on
the path."""
if environ['PATH_INFO'] == '/some_url':
return game_room(environ, start_response)

if __name__ == "__main__":
# run an example app from the command line
listener = eventlet.listen(('0.0.0.0', 16081))
wsgi.server(listener, dispatch, debug=True)

为了简洁起见,我截断了一些代码。如果我使用JavaScript访问页面,它可以正常工作。运行 wsgi 服务器的控制台报告从客户端计算机的正确 IP 建立了连接。问题是,如果我使用手机导航到同一页面,套接字不会报告任何内容。如果我关闭计算机上的选项卡并重新加载套接字服务器,则可以连接手机。不知何故,它似乎无法处理并发连接。

我不知道从哪里开始。我可以在运行服务器时编辑一些选项吗?

请将测试代码减少到最低限度,然后将其粘贴到完整。不要隐藏部分代码。截断的代码将我们引向神秘猜测的道路。

我的第一个猜测是你有这样的东西:

import time
import eventlet
def fun(name):
while True:
print('{0} tick'.format(name))
time.sleep(1)
eventlet.spawn(fun, 'f1')
eventlet.spawn(fun, 'f2')
eventlet.sleep(10)

这只允许一个协程运行,因为time.sleep会阻止所有内容。

请识别使用两个不同sleep函数的代码气味。始终了解原因并有充分的理由这样做。

  • 在此合成示例中,最佳选择是使用eventlet.sleep
  • 在实际代码中,sleep几乎不使用,您宁愿对数据流做出反应,也不愿对时间流做出反应。
  • 如果必须调用用纯 Python 编写的阻塞函数,请使用eventlet.import_patched获得所需模块的绿色版本,其中所有阻塞函数都为协程修复。
  • 如果必须调用在 C 模块内部阻塞的函数,请使用eventlet.tpool.execute让它在单独的操作系统线程中运行。

不幸的是,如果您截断了类似from eventlet.green import time的内容并且问题不同,则此答案可能完全无关紧要。

最新更新