python - 扩展最大连接数 - Python websockets 9.1 和 simple-websocket-server 0.4.1
问题描述
我希望我一次可以有大约 3k 个连接,但是在运行服务器时,我遇到了两个 websockets 库的严重崩溃(在 Win 10 x64 中大约有 500 个连接,在 Ubuntu 中大约有 1019 个连接):
这是导致问题的stresstestscript.py(即使我通过局域网在不同的机器上运行这个):
import websocket,time
serveraddr="ws://localhost:12345"
ws = websocket.WebSocket()
ws.connect(serveraddr)
list = []
for b in range(3000):
list.append(websocket.WebSocket())
count=1
for x in list:
count+=1
x.connect(serveraddr)
time.sleep(0.01)
time.sleep(5000)
这是server.py ( websockets 官方文档上的确切示例):
#!/usr/bin/env python
# WS server example that synchronizes state across clients
import asyncio
import json
import logging
import websockets
logging.basicConfig()
STATE = {"value": 0}
USERS = set()
def state_event():
return json.dumps({"type": "state", **STATE})
def users_event():
return json.dumps({"type": "users", "count": len(USERS)})
async def notify_state():
if USERS: # asyncio.wait doesn't accept an empty list
message = state_event()
await asyncio.wait([user.send(message) for user in USERS])
async def notify_users():
if USERS: # asyncio.wait doesn't accept an empty list
message = users_event()
await asyncio.wait([user.send(message) for user in USERS])
async def register(websocket):
USERS.add(websocket)
print("add")
await notify_users()
async def unregister(websocket):
USERS.remove(websocket)
await notify_users()
async def counter(websocket, path):
# register(websocket) sends user_event() to websocket
await register(websocket)
try:
await websocket.send(state_event())
async for message in websocket:
data = json.loads(message)
if data["action"] == "minus":
STATE["value"] -= 1
await notify_state()
elif data["action"] == "plus":
STATE["value"] += 1
await notify_state()
else:
logging.error("unsupported event: %s", data)
finally:
await unregister(websocket)
start_server = websockets.serve(counter, "localhost", 12345)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
这是服务器错误(在 Windows 上,当超过一次打开的 500 个连接时):
Traceback (most recent call last):
File "websockettestserver.py", line 70, in <module>
asyncio.get_event_loop().run_forever()
File "C:\Python37-32\lib\asyncio\base_events.py", line 539, in run_forever
self._run_once()
File "C:\Python37-32\lib\asyncio\base_events.py", line 1739, in _run_once
event_list = self._selector.select(timeout)
File "C:\Python37-32\lib\selectors.py", line 323, in select
r, w, _ = self._select(self._readers, self._writers, [], timeout)
File "C:\Python37-32\lib\selectors.py", line 314, in _select
r, w, x = select.select(r, w, w, timeout)
ValueError: too many file descriptors in select()
就像我说的,我希望我能有更多的同时连接,将 Linux 上的大约 1000 个连接增加到 3000-4000(!?)。如何解决这个问题?
解决方案
server.py
1.在 diff 端口上运行更多 diff
2.使用 nginx 分发请求
推荐阅读
- firebase - flutter firebase_admob 集成 - 如何将它与应用程序风格一起使用
- iis - 如何在 IIS 中设置 ISO 日期格式
- perl - 为什么包含 fork() 调用会创建更多循环
- google-cloud-platform - 模型 gcloud ml-engine 版本创建期间的问题
- laravel - 如何解决此错误“无法连接,请检查您的 Algolia 应用程序 ID”?
- ascii - 在 Asciidoc 中使用突出显示的源代码创建表
- angular - 无法使用带有 angular5 和 ionic 的传单实时插件
- wordpress - 我如何循环 WordPress 特定的帖子
- import - AttributeError:模块“pytest”没有“来自sklearn.model_selection import cross_val_score”的属性“mark”
- codenameone - 如何配置代号项目以安装在 Android 的外部存储上