Can';t初始化并发websocket连接[eventlet、Flask、javascript]

Can';t初始化并发websocket连接[eventlet、Flask、javascript],javascript,python,sockets,wsgi,eventlet,Javascript,Python,Sockets,Wsgi,Eventlet,我正在使用一个使用eventlet用Python编写的服务器端端点和一个用JavaScript编写的客户端起始点来处理WebSocket: 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) { c

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

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
会阻塞所有内容

请识别使用两种不同的
睡眠
功能时的代码气味。始终理解原因并有充分的理由这样做

  • 在这个合成示例中,最好的选择是使用
    eventlet.sleep
  • 在真实代码中,睡眠几乎不被使用,你宁愿对数据流做出反应,也不愿对时间流做出反应
  • 如果您必须调用纯Python编写的阻塞函数,请使用
    eventlet.import\u patched
    获得所需模块的绿色版本,其中所有阻塞函数都已修复,可用于协同程序
  • 如果必须调用C模块内部阻塞的函数,请使用
    eventlet.tpool.execute
    使其在单独的操作系统线程中运行

不幸的是,如果您从eventlet.green import time中截断了类似于
的内容,则此答案可能完全不相关,而问题则不同。

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

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

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
会阻塞所有内容

请识别使用两种不同的
睡眠
功能时的代码气味。始终理解原因并有充分的理由这样做

  • 在这个合成示例中,最好的选择是使用
    eventlet.sleep
  • 在真实代码中,睡眠几乎不被使用,你宁愿对数据流做出反应,也不愿对时间流做出反应
  • 如果您必须调用纯Python编写的阻塞函数,请使用
    eventlet.import\u patched
    获得所需模块的绿色版本,其中所有阻塞函数都已修复,可用于协同程序
  • 如果必须调用C模块内部阻塞的函数,请使用
    eventlet.tpool.execute
    使其在单独的操作系统线程中运行

不幸的是,如果您从eventlet.green import time
中截断了类似于
的内容,则此答案可能完全不相关,而问题则不同。

此代码将引发
名称错误时间未定义
。此代码将引发
名称错误时间未定义
。非常感谢。我截断了代码,因为我假设问题不会出现在我排除的逻辑中。我想防止端点不断地查询数据库,所以我尝试使用
sleep()
来每秒只调用一次(或任意间隔)。有什么更好的方法吗?如果要将部分应用程序逻辑放入数据库,请使用数据库的通知机制。示例:如果您希望严格地将数据库作为存储,请让一个应用程序实例通过您选择的某个通信通道通知其他应用程序实例的更改。示例:ZeroMQ发布/订阅。非常感谢。我截断了代码,因为我假设问题不会出现在我排除的逻辑中。我想防止端点不断地查询数据库,所以我尝试使用
sleep()
来每秒只调用一次(或任意间隔)。有什么更好的方法吗?如果要将部分应用程序逻辑放入数据库,请使用数据库的通知机制。示例:如果您希望严格地将数据库作为存储,请让一个应用程序实例通过您选择的某个通信通道通知其他应用程序实例的更改。示例:ZeroMQ发布/订阅。