【发布时间】:2018-06-22 02:42:07
【问题描述】:
我正在尝试使用python-socketio 设置 socket.io 服务器。 这是一个最小的工作示例:
import asyncio
from aiohttp import web
import socketio
import random
sio = socketio.AsyncServer(async_mode='aiohttp')
app = web.Application()
sio.attach(app)
@sio.on('connect')
def connect(sid, environ):
print("connected: ", sid)
@sio.on('sendText')
async def message(sid, data):
print("message ", data)
# await asyncio.sleep(1 * random.random())
# print('waited', data)
@sio.on('disconnect')
def disconnect(sid):
print('disconnect ', sid)
if __name__ == '__main__':
web.run_app(app, host='0.0.0.0', port=8080)
这运行良好,例如我可以执行(在 node.js 中)
const io = require('socket.io-client');
const socket = io('ws://localhost:8080');
socket.emit('sendText', 'hey 1')
socket.emit('sendText', 'hey 2')
socket.emit('sendText', 'hey 3')
如果我运行服务器并运行上面的节点脚本,我会得到服务器端
已连接:c1e687f0e2724b339fcdbefdb5aaa8f8
发消息嘿1
发消息嘿2
发消息嘿 3
但是,如果我取消注释代码中的 await sleep 行,我只会收到第一条消息:
已连接:816fb6700f5143f7875b20a252c65f33
发消息嘿1
等一下,嘿 1
我不明白为什么没有出现下一条消息。
只能同时运行一个async def message 实例吗?或者为什么?
我确信我不了解它是如何工作的一些非常基本的东西。如果有人能指出我不理解的地方,我将不胜感激。
【问题讨论】:
-
当您运行睡眠时,它会停止一段时间,因此接收到的任何消息都不会被正确处理。
-
睡眠的不只是对协程的调用吗?
-
@Jaxi:
asyncio.sleep()确实不会阻塞执行,它专门设计用于将协程放在非活动队列中,直到时间过去。您似乎将此与time.sleep()混淆了。 -
@Julius:宾果游戏。我的
aiohttp相当老了,aiohttp==1.0.2;我们的python-socketio版本匹配。但是当我将aiohttp升级到版本 2.3.7 时,我看到了同样的问题。 -
@Julius:和 2.2.5 没有表现出这种行为,但 2.3.0 会。我们正在做一些事情。
标签: python python-3.x asynchronous socket.io python-asyncio