javascript - Python-SocketIO 服务器需要很长时间才能触发事件

标签 javascript python websocket socket.io aiohttp

我有一个 python websocket 服务器尝试与 javascript websocket 客户端(嵌入在 HTML 中)进行通信。事件会立即从服务器发出,但服务器需要花费 30 秒以上的时间来发送事件触发器,尽管客户端和服务器都在本地托管。

这是服务器的相关代码:

sio = socketio.AsyncServer(cors_allowed_origins='*')
app = web.Application() #aiohttp web server
loop = asyncio.get_event_loop()
sio.attach(app)

async def index(request):
    with open('./index.html') as f:
        return web.Response(text=f.read(), content_type='text/html')

app.router.add_get('/', index)
app.router.add_get('/index.html', index)

if __name__ == '__main__':
    web.run_app(app)

事件像这样被触发(编辑,这必须通过事件循环来完成,因为 emit 是一个从同步函数运行的异步函数。):

print('Starting event')
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(sio.emit('ChangeProgressState'))
loop.close()
print('Event has been fired.')

但是,打印语句会立即显示。在客户端,我正在连接并尝试使用这样的事件:

const socket = io.connect("http://localhost:8080", {
      transports: ['websocket']
})

socket.on("ChangeProgressState", function (data) {
    console.log("got event.")
    //some code here...
});

但是,从事件触发所需的时间到 JavaScript 套接字注意到所需的时间可能会很长,从 30 秒到有时几分钟。我在这里做错了什么吗?

应该指出的是,消耗的资源非常少(2%-5%)(内存和 CPU),所以我目前认为这不是问题。任何帮助将非常感激。

编辑2019年11月15日:我尝试查看应用程序的网络选项卡(树莓派上的 Chrome 浏览器)。它似乎显示了初始套接字连接,但它没有显示套接字之间的通信方面的任何内容,即使在事件最终触发之后也是如此。

编辑2:这似乎绝对是服务器端的问题。我基本上可以立即将事件从 JS 客户端发送到 python 服务器,但反之则需要很长时间才能到达。但我不太确定为什么。

最佳答案

啊好吧,我的直觉告诉我,听起来客户端正在长时间轮询。许多socket库首先建立长轮询,然后升级为ws连接。

查看 Socket.io 后:

... which first establishes a long-polling connection, then tries to upgrade to better transports that are “tested” on the side, like WebSocket. ...

所以我不相信你做错了什么,这只是建立WebSocket连接的初始化过程。

至于 python 部分,说实话,这对我来说有点模糊。我的第一个猜测是循环代码不会阻止 print 语句的执行——但我对 JavaScript 比 Python 更熟悉,所以在这方面并不完全确定。我的第二个猜测是,我确实从其他发布/订阅库中知道服务器端引擎有时会使用某种中间层(有时是缓存,有时是队列)来帮助确保发送/接收消息,这也是一种可能性.

额外花絮:我怀疑如果您查看浏览器开发工具的网络选项卡,它会显示该行为,某种形式的 HTTP 请求,然后最终您会看到套接字连接。尝试关闭/打开 Python 服务器/服务还可以展示 socket.io 在浏览器中的稳健性,以及在使用各种互联网通信协议(protocol)进行通信时如何处理不稳定网络的边缘情况。

关于javascript - Python-SocketIO 服务器需要很长时间才能触发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58865980/

相关文章:

python加载的内存比文件的实际大小多

python - 在一段时间内有条件

python - 为什么我应该将 Python 包安装到 `~/.local` 中?

JavaScript : dynamically changing the colour of messages

javascript - 具有最小网络流量的进度条

javascript - 阻止直接访问 Azure 文件,除非通过 Ember 应用程序

javascript - 如何在局部变量中包含 javascript 内容或在本地提供命名空间

javascript - 通过 wss 的 Websocket ://disconnects without any errors

javascript - MobX 没有在我的类里面正确设置 observable

javascript - Google+ API 获取所有照片