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

标签 javascript python sockets wsgi eventlet

我正在使用使用 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)

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

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

最佳答案

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

我的第一个猜测是你有类似的东西:

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,您宁愿对数据流使用react,而不是对时间流使用react。
  • 如果您必须调用用纯 Python 编写的阻塞函数,请使用 eventlet.import_patched 获得所需模块的绿色版本,并为协程修复了所有阻塞函数。
  • 如果必须调用在 C 模块内阻塞的函数,请使用 eventlet.tpool.execute 使其在单独的操作系统线程中运行。

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

关于javascript - 无法初始化并发 websocket 连接 [eventlet、Flask、javascript],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44114168/

相关文章:

python - 减少最简单值的路径?

multithreading - 有没有办法检查连接是否已关闭然后完成线程?

javascript - TypeORM - 3 个相关表之间的 LEFT JOIN/INNER JOIN 问题

javascript - 如何使用 Python 触发 javascript 事件

javascript - 重置多选选项

javascript - 在动态 div 中追加动态段落

python - Linux 新手 : need some help installing wxpython development environment on ubuntu 18. 04

python - 替换所有列中的缺失值,除了 pandas 数据框中的一列

python - 我可以避免 Python 中的线程 UDP 套接字丢失数据吗?

java - 多个服务器同时也是客户端 - JAVA 中的通信