- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写类似于以下代码的代码。有时程序会停止工作,或者我会收到有关 socketio session 访问的奇怪错误。慢慢地我觉得这可能是竞争条件。
更多的是伪代码。我想证明,我从多个协程访问全局共享状态和套接字 session 。
import asyncio as aio
from aiohttp import web
import socketio
app = web.Application()
sio = socketio.AsyncServer()
app["sockets"] = []
@sio.on("connect")
async def connect(sid):
app["sockets"].append(sid)
@sio.on("disconnect")
async def disconnect(sid):
app["sockets"].remove(sid)
@sio.on("set session")
async def set_session(sid, arg):
await sio.save_session(sid, {"arg": arg})
async def session_route(req):
data = await req.json()
for sid in app["sockets"]:
await sio.save_session(sid, {"arg": data["arg"]})
return web.Response(status=200)
if __name__ == '__main__':
web.run_app(app)
最佳答案
这里肯定有问题:
for sid in app["sockets"]: # you are iterating over a list here
await sio.save_session(...) # your coroutine will yield here
您正在迭代列表app["sockets"]
,并且在每次迭代中使用await
关键字。使用 await
关键字时,您的协程将被挂起,并且事件循环会检查另一个协程是否可以执行或恢复。
假设 connect(...)
协程在 session_route
等待时运行。
app["sockets"].append(sid) # this changed the structure of the list
connect(...)
更改了列表的结构。这可以使该列表当前存在的所有迭代器无效。 disconnect(...)
协程也是如此。
因此,要么不要修改列表,要么至少在列表更改后不要重用迭代器。后一种解决方案在这里更容易实现:
for sid in list(app["sockets"]):
await sio.save_session(...)
现在 for 循环迭代原始列表的副本。现在更改列表不会“干扰”副本。
但请注意,副本无法识别列表中的添加和删除。
所以,简而言之,你的问题的答案是是,但它与async io无关。同样的问题很容易出现在同步代码中:
for i in my_list:
my_list.remove(1) # don't do this
关于python - python aiohttp socketio 中是否可能存在竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58056397/
我正在选择一个 python 库来编写一个嵌入我网站的实时聊天功能页面。 我找到了两个基于 Socket.IO 的库,python-socketio 和 gevent-socketio: 来自 pyt
我正在使用 socketio 和 netty 以及 java,我对它们都是新手。 我的客户端代码如下所示。 webSocket test
我正在尝试在外部值发生变化时发送广播。 Camonitor 在值改变时调用回调,我想通知所有连接的客户端值已经改变,他们需要刷新。 from flask import Flask from epics
我在使用 flasks socketio 时遇到了问题,似乎当我调用 socketio.emit('my event', 'my message') 时它根本不会发出任何事件。 .. 所以这是我的设置
我有一个 socketio 服务器/客户端可以很好地协同工作,但是我想开始为服务器在页面加载或正常运行期间脱机时编写事件。 我在我的头文件中包含了远程 socket.io 代码: /socket.io
我正在使用 flask-socketio 和 python-socketio 开发一个项目。为了确保通信安全,系统需要使用 SSL 进行升级。我正在使用 Mac 和 Python 3.7。 我使用 o
我目前正在尝试了解套接字的工作原理。我正在使用 Flask-socketio 和 python socketio 客户端并运行一个基本示例。这是我到目前为止所做的 应用.py from flask i
我正在尝试使用 Socket.IO 开发一个聊天应用程序。我的服务器端是安装了 express + socket.io 库的 Node.js,我的客户端是 Android + Web。 我尝试在我的客
我正在构建一个 Android 聊天应用程序。我在服务器端使用 nodejs 并尝试实现 android client for socketIO.我收到 SocketIO 异常。代码有什么问题? 服务
我将 Flask 与 gevent-socketio 一起使用: $ cat requirements.txt Flask==0.10.1 Jinja2==2.7.1 MarkupSafe==0.18
我正在为某个项目使用 netty-socketio。我像这样设置了一个服务器: Configuration config = new Configuration(); config.setHostna
所以,我需要收集很多数据,比如每秒 3 个单位的数据,由很多人收集。我将收集此数据的事件命名为“捕获”。 我正在使用 JWT 对其他数据密集度较低的事件进行身份验证。 现在,我只是担心使用每个数据密集
socketio不仅可以用来做聊天工具,也可以实现局域网(当然你如果有外网也可用外网)内实现文件的上传和下载,下面是代码的效果演示: git地址: https://github.com/fen
我正在使用 flask-socketio 创建一个聊天应用程序,现在我想在客户端断开连接时使用客户端的用户名向服务器发送一条消息,即当客户端关闭浏览器/选项卡时,以便我可以将该消息从服务器发送到所有现
我正在尝试向从单独文件连接的所有套接字发出。但是我似乎无法弄清楚。 Socket.js var socketio = require('socket.io'); var users = require
我尝试在我的 django 应用程序中实现与 django-socketio 的聊天。 首先要了解django-socketio,所以看了https://github.com/stephenmcd/d
我对网络编程有点陌生。我现在正在尝试编写一个服务器。在服务器端我有一个方法: socket.on("joinserver", function(name, device) { }); 在客户端,
我正在尝试将数据从客户端发送到服务器端。我只得到未定义。我希望用户单击 ledOn 函数来发送 1 ,并单击 ledOff 来发送 0 到服务器。 server.js io.sockets.on('c
我使用nodejs设置了一个简单的Socket服务器gameIo gameIo.on("connection", socket => { socket.on("sign up", () => {
我想知道是否有一种方法可以在两个(或多个)flask-socketio 服务器之间直接通信。我想在服务器之间传递信息,并让客户端连接单个 Web 套接字服务器,该服务器将具有来自其他服务器的所有组合逻
我是一名优秀的程序员,十分优秀!