Czarek 遇到了一个问题,他想要与一个外部的 Python 进程进行通信,但这个外部进程不是从当前 Python 进程中启动的子进程,并且两个进程的路径可能相同。Czarek 想知道如何与该进程通信,以及如何在这些进程之间轻松发送 Python 数据类型。
2、解决方案
一种可行的解决方案是使用 zeromq 库。zeromq 是一个强大的消息队列库,可以用来在不同进程、线程甚至不同机器之间进行通信。
1)安装 zeromq
在使用 zeromq 之前,需要先安装它。可以在终端中使用以下命令进行安装:
pip install pyzmq
2)编写通信代码
在安装好 zeromq 之后,就可以编写通信代码了。以下是一个简单的示例,其中一个进程作为发送方,另一个进程作为接收方:
发送方代码:
http://www.jshk.com.cn/mb/reg.asp?kefu=xiaoding;//爬虫IP免费获取;
import zmq
# 创建一个 ZMQ Context,并创建一个 PUSH 套接字
context = zmq.Context()
socket = context.socket(zmq.PUSH)
# 绑定套接字到特定的 TCP 端口
socket.bind("tcp://127.0.0.1:5555")
# 发送消息
socket.send(b"Hello, world!")
接收方代码:
import zmq
# 创建一个 ZMQ Context,并创建一个 PULL 套接字
context = zmq.Context()
socket = context.socket(zmq.PULL)
# 绑定套接字到特定的 TCP 端口
socket.bind("tcp://127.0.0.1:5555")
# 接收消息
message = socket.recv()
# 打印消息
print(message)
在运行上述代码之前,需要确保两个进程都正在运行。运行发送方代码的进程将把 "Hello, world!" 消息发送到接收方代码的进程。接收方代码的进程将接收消息并将其打印到终端。
3)发送 Python 数据类型
zeromq 不仅可以发送字符串,还可以发送 Python 数据类型,如列表、字典和对象。为了发送 Python 数据类型,可以使用 pickle 模块。pickle 模块提供了将 Python 对象序列化和反序列化的功能。
以下是一个发送 Python 数据类型的示例:
发送方代码:
import zmq
import pickle
# 创建一个 ZMQ Context,并创建一个 PUSH 套接字
context = zmq.Context()
socket = context.socket(zmq.PUSH)
# 绑定套接字到特定的 TCP 端口
socket.bind("tcp://127.0.0.1:5555")
# 创建一个要发送的数据字典
data = {"name": "John Doe", "age": 30}
# 将数据字典序列化为字节流
data_bytes = pickle.dumps(data)
# 发送数据
socket.send(data_bytes)
接收方代码:
import zmq
import pickle
# 创建一个 ZMQ Context,并创建一个 PULL 套接字
context = zmq.Context()
socket = context.socket(zmq.PULL)
# 绑定套接字到特定的 TCP 端口
socket.bind("tcp://127.0.0.1:5555")
# 接收字节流
data_bytes = socket.recv()
# 将字节流反序列化为数据字典
data = pickle.loads(data_bytes)
# 打印数据字典
print(data)
在运行上述代码之前,需要确保两个进程都正在运行。运行发送方代码的进程将把数据字典发送到接收方代码的进程。接收方代码的进程将接收数据字典并将其打印到终端。
综上所述,使用 zeromq 库可以轻松地实现 Python 进程之间的通信,并且还可以发送 Python 数据类型。