pynng库 常见方法和功能
pynng
是一个 Python 库,用于实现 NNG(Nanomsg),一个轻量级的、高性能的、模块化的 socket 通信库。NNG 旨在简化分布式系统的开发,提供多种通信模式,如发布/订阅(publish/subscribe)、请求/响应(request/reply)、管道(pipeline)等。pynng
库为 Python 开发者提供了一个简单的接口,以便在 Python 程序中使用 NNG 的功能。
pynng
主要提供了以下功能:
- 支持多种通信协议:
pynng
提供了多种通信模式,如Pair0
(双向对称通信)、Pub0
(发布)、Sub0
(订阅)、Push0
(推送)和Pull0
(拉取)等。你可以根据需求选择合适的通信模式。 - 套接字操作:
pynng
提供了用于创建、配置和关闭套接字的方法。例如,你可以使用socket.set_string_option()
和socket.get_string_option()
方法设置和获取套接字的字符串选项,或使用socket.set_int_option()
和socket.get_int_option()
方法设置和获取套接字的整数选项。 - 地址操作:
pynng
提供了用于绑定套接字到本地地址或远程地址的方法。例如,你可以使用socket.listen()
方法将套接字绑定到本地地址,或使用socket.dial()
方法将套接字连接到远程地址。 - 数据传输:
pynng
提供了用于发送和接收数据的方法。例如,你可以使用socket.send()
方法发送数据,或使用socket.recv()
方法接收数据。 - 上下文管理:
pynng
提供了用于创建和管理上下文(Context)的方法。上下文是一组相关套接字的容器,它们共享相同的生命周期。你可以使用nng.Context()
创建一个新的上下文,或使用context.close()
方法关闭上下文。
简单示例1,
展示了如何创建一个请求/响应(request/reply)模式的客户端和服务器:
客户端:
import pynng
# 创建一个上下文
ctx = pynng.Context()
# 创建一个请求套接字
req_socket = ctx.socket(pynng.Req0)
# 连接到服务器
req_socket.dial("tcp://localhost:1234")
# 发送请求
req_socket.send(b"Hello, Server!")
# 接收响应
response, _ = req_socket.recv()
print(response) # 输出: b"Hello, Client!"
服务器端:
import pynng
# 创建一个上下文
ctx = pynng.Context()
# 创建一个响应套接字
rep_socket = ctx.socket(pynng.Rep0)
# 监听传入的连接
rep_socket.listen("tcp://*:1234")
while True:
# 接收请求
request, _ = rep_socket.recv()
# 处理请求并发送响应
response = request.decode().upper() + "!"
rep_socket.send(response.encode())
这个例子展示了如何使用 pynng
创建一个简单的请求/响应模式的客户端和服务器。你可以根据需要调整代码,以实现更复杂的通信场景。
pynng
提供了以下主要组件:
Context
: 一个上下文是一组相关套接字的容器。每个上下文可以包含多个套接字,它们共享相同的生命周期。你可以通过nng.Context()
创建一个新的上下文。Socket
: 套接字是通信的基本单元。NNG 支持多种通信模式,如nng.Pair0
(双向对称通信)、nng.Pub0
(发布/订阅)和nng.Sub0
(发布/订阅)等。你可以通过nng.Socket()
创建一个套接字,并指定所需的通信模式。Listener
和Dialer
: 用于绑定套接字到本地地址或远程地址。Listener
用于监听传入的连接,而Dialer
用于发起连接。你可以通过socket.listen()
和socket.dial()
方法创建监听器和拨号器。
以下是 pynng
的一些主要方法:
1. send()
: 发送消息到远程套接字。例如:
socket.send(b"Hello, World!")
2. recv()
: 从远程套接字接收消息。例如:
message = socket.recv()
print(message) # 输出: b"Hello, World!"
3. set_string_option()
和 get_string_option()
: 设置和获取套接字的字符串选项。例如:
socket.set_string_option("protocol", "tcp")
protocol = socket.get_string_option("protocol")
print(protocol) # 输出: "tcp"
4. set_int_option()
和 get_int_option()
: 设置和获取套接字的整数选项。例如:
socket.set_int_option("maxttl", 5)
max_ttl = socket.get_int_option("maxttl")
print(max_ttl) # 输出: 5
5. close()
: 关闭套接字。例如:
socket.close()
pynng
库使得在 Python 中使用 NNG 变得简单,提供了高性能和灵活的通信功能。它适用于各种分布式系统,如微服务、实时消息传递等。
简单示例 2
使用 pynng
创建一个发布/订阅(publish/subscribe)模式的消息系统。
在这个例子展示如何使用 pynng
创建一个简单的发布/订阅消息系统。你可以根据需要调整代码,以实现更复杂的通信场景。
1,我们创建一个发布者:
import pynng
# 创建一个上下文
ctx = pynng.Context()
# 创建一个发布套接字
pub_socket = ctx.socket(pynng.Pub0)
# 将套接字绑定到本地地址
pub_socket.listen("inproc://my_pipe")
# 发布消息
pub_socket.send(b"Hello, Subscriber!")
2,创建一个订阅者:
import pynng
# 创建一个上下文
ctx = pynng.Context()
# 创建一个订阅套接字
sub_socket = ctx.socket(pynng.Sub0)
# 订阅所有主题
sub_socket.set_string_option("subscribe", "")
# 将套接字连接到发布者
sub_socket.dial("inproc://my_pipe")
# 接收消息
msg, _ = sub_socket.recv()
print(msg) # 输出: b"Hello, Subscriber!"
上面这个例子,我们创建了一个发布者和一个订阅者,它们通过名为 my_pipe
的内部通信通道(inproc)进行通信。发布者通过 send()
方法发送消息,订阅者通过 recv()
方法接收消息。