三明企业网站建设公司,网页策划设计,做商城网站需要的功能,网站的层次Python 实现 websocket 服务很简单#xff0c;有很多的三方包可以用#xff0c;我从网上大概找到三种常用的包#xff1a;websocket、websockets、Flask-Sockets。
但这些包很多都“年久失修”#xff0c; 比如 websocket 在 2010 年就不维护了。 而 Flask-Sockets 也在 2…Python 实现 websocket 服务很简单有很多的三方包可以用我从网上大概找到三种常用的包websocket、websockets、Flask-Sockets。
但这些包很多都“年久失修” 比如 websocket 在 2010 年就不维护了。 而 Flask-Sockets 也在 2016 年停止维护。 这也给我们提了一个醒用三方包的时候一定要看下这个包是否还在持续维护如果作者已经停止了维护那就坚决不要再用了因为过不了多久你就会吃个大亏的。
websockets
排除了两个已经不维护的包现在只剩下一个 websockets 了那么这个包会满足我们的需求吗
首先看了下 websockets发现社区最近还在维护而且 websockets 还有完整的源码和使用教程对新手非常友好。 源码和教程地址 https://pypi.org/project/websockets/ https://github.com/python-websockets/websockets https://websockets.readthedocs.io/en/stable/intro/tutorial1.html 示例
service.py
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-import asyncio
import websocketsasync def hello(websocket):recv_data await websocket.recv()print( %s % recv_data)send_data Hello %s % recv_dataawait websocket.send(send_data)print( %s % send_data)async def start():print(Server started ...)async with websockets.serve(hello, 0.0.0.0, 8765):await asyncio.Future()if __name__ __main__:asyncio.run(start())client.py
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-import asyncio
import websocketsasync def hello():uri ws://0.0.0.0:8765async with websockets.connect(uri) as websocket:send_data input(Whats your name: )await websocket.send(send_data)print( %s % send_data)recv_data await websocket.recv()print( %s % recv_data)if __name__ __main__:asyncio.run(hello())这样就是个简单的 WebSocket 服务器/客户端程序了也是 WebSocket 中最核心的东西了。
运行结果 但是这样有一个问题服务器在收到一条消息之后就关闭连接如果想实现持久连接就需要用到循环来处理了。
async with websockets.connect(uri) as websocket:for i in range(10):send_data input(Whats your name: )...如果用到异步需要加上 async
async def handler(websocket):async for message in websocket:print(message)有时候可能还会出现一次只能有一个客户端连接的问题一般来说这是程序中时间的调用没有使用异步导致。
例如此连接处理程序可阻止事件循环在一秒钟内运行
async def handler(websocket):time.sleep(1)...将其更改为
async def handler(websocket):await asyncio.sleep(1)...如何开启多进程
如果想开启多进程可以用 Python 自带的包实现先导入进程池模块然后启动所有进程多进程用法参考 Python3 多进程编程 这篇文章。
from multiprocessing import Pool...def main():asyncio.run(start())if __name__ __main__:p Pool(30)for i in range(10):p.apply_async(main)p.close()p.join()...更多技巧和常见问题请参考https://websockets.readthedocs.io/en/stable/faq/server.html