官方文档:https://pyuv.readthedocs.io/en/v1.x/
官方git:https://github.com/saghul/pyuv
pyuv是一个基于libuv的Python异步网络框架,可以用于构建高性能的事件驱动应用程序。它提供了事件循环、异步IO、定时器等功能,使开发人员能够方便地编写高效的网络应用程序。
pyuv支持TCP、UDP、IPC等多种网络协议,并且可以轻松地处理大量的并发连接。通过使用基于回调的编程模型,开发人员可以编写非阻塞的代码,从而充分利用系统资源,提高应用程序的性能。
除了网络编程,pyuv还支持文件系统操作、进程管理和信号处理等功能。它还提供了一些高级特性,如异步DNS解析、流式操作等,使开发人员能够更方便地处理复杂的网络场景。
pyuv是Python的uvloop事件循环库,它提供了libuv的Python绑定,可以实现高性能的异步IO。
import pyuv
def on_read(handle, data, addr, flags):
print("Received message:", data.decode())
handle.close()
def on_send(handle, error):
if error:
print("Send error:", pyuv.errno.strerror(error))
else:
print("Message sent")
loop = pyuv.Loop.default_loop()
udp = pyuv.UDP(loop)
udp.bind(("0.0.0.0", 12345))
udp.start_recv(on_read)
message = b"Hello, UDP!"
udp.sendto(("127.0.0.1", 12345), message, on_send)
loop.run()
我们创建了一个UDP对象udp,并将其绑定到本地地址127.0.0.1的端口12345上。然后,我们通过调用udp.start_recv()方法告诉UDP对象在接收到数据时调用on_read()函数来处理数据。在on_read()函数中,我们简单地打印出接收到的消息并关闭UDP对象。
接下来,我们使用udp.sendto()方法发送一条消息给自己的地址和端口。在发送完成后调用on_send()函数来检查是否有发送错误。
,如果对IPv4和IPv6完全没有差异化要求,通常一个socket同时监听IPv4和IPv6是更方便的做法。pyuv本身确实支持同时监听IPv4和IPv6,但是需要使用 pyuv.UV_TCP_REUSEADDR 标志。
import pyuv
def on_connection(server, error):
# 处理连接逻辑
pass
loop = pyuv.Loop()
server = pyuv.TCP(loop)
server.bind(("::", 8000), pyuv.UV_TCP_REUSEADDR)
server.listen(on_connection)
print("服务器启动,监听端口8000")
print("同时支持IPv4和IPv6")
try:
loop.run()
except KeyboardInterrupt:
pass
server.close()
loop.close()
主要注意点:
总结:说明,使用这种方案,也可以区分是ipv4和ipv6。
通常一个socket同时监听IPv4和IPv6是更方便的做法。但是在某些特殊场景下,还是需要分别创建IPv4和IPv6的socket:
总结:考虑扩展性、监控、隔离等因素,才选择分别绑定IPv4和IPv6的服务器socket。
我们可以根据应用场景需要,灵活选择最佳方案。