目录
1、应用场景
Python的websockets库是一个用于处理WebSocket协议的库,WebSocket是一个用于在浏览器和服务器间进行全可信双向通信的网络协议。
其应用场景主要包括:
- 实时通信: 如在线聊天应用、协作工具、多玩家游戏等需要实时交互的场景。
- 实时数据推送: 比如股票信息、天气信息、新闻更新、设备状态等实时数据的推送。
- 物联网(IoT): 用于服务器与设备间的实时通信。
- 服务端推送技术: 服务器可以主动向客户端发送信息,客户端无需频繁请求刷新。
- 在线教育或在线视频类应用: 老师可以实时看到所有在线学生的反馈。
- 实时监控: 例如流量监控、系统性能监控等需要实时反馈数据的场景。
通常来说,只要涉及到需要服务器和客户端进行双向实时交互的应用,都可以使用websockets库来实现。
2、websockets库-三方库
websockets不是Python的标准库,他是一个Python的第三方库,可以通过pip进行安装。
Python中websockets库的常用方法有以下几个:
- websockets.serve(): 这个函数负责创建并启动一个WebSocket服务器。
import asyncio
import websockets
async def hello(websocket, path):
name = await websocket.recv()
print(f"< {name}")
greeting = f"Hello {name}!"
await websocket.send(greeting)
print(f"> {greeting}")
start_server = websockets.serve(hello, "localhost", 8765)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
- websocket.recv(): 这个函数是一个协程函数,用于从WebSocket接收消息。
- websocket.send(): 这个函数是一个协程函数,用于向WebSocket发送消息。
- websockets.connect(): 这个函数负责创建一个 WebSocket 客户端。
import asyncio
import websockets
async def hello():
uri = "ws://localhost:8765"
async with websockets.connect(uri) as websocket:
name = input("What's your name? ")
await websocket.send(name)
print(f"> {name}")
greeting = await websocket.recv()
print(f"< {greeting}")
asyncio.get_event_loop().run_until_complete(hello())
- websocket.close(): 关闭 WebSocket 连接。
- websockets.exceptions: 提供了WebSocket特定的异常。如:ConnectionClosed、InvalidHandshake、InvalidOrigin等。
请注意,websockets库大多数的函数都是协程(coroutine)函数,需要使用 async/await 关键字。
协程(Coroutine)是一种比线程更加轻量级的存在。线程是操作系统的调度单位,而协程是程序调度的单位。也就是说,虽然两者都满足多任务的需要,但是协程的切换开销更小。
在Python中,协程函数被定义为一个包含有async def语句的函数:
async def coroutine_function():
# Your code here
pass
协程函数不能直接执行,而需要通过event loop(事件循环)来调用。你可以像这样使用它:
loop = asyncio.get_event_loop() # 获取事件循环
loop.run_until_complete(coroutine_function()) # 调用协程函数
在协程函数内部,你可以使用await来挂起自身的执行以等待另一个I/O操作完成。
协程函数、async/await,以及asyncio库等都是Python3.5以后版本才引入的新特性,用以更好地处理异步I/O操作,特别是在需要高并发的web服务器和爬虫等应用中有着广泛的应用。