Python 进程通信

261 阅读3分钟

Czarek 遇到了一个问题,他想要与一个外部的 Python 进程进行通信,但这个外部进程不是从当前 Python 进程中启动的子进程,并且两个进程的路径可能相同。Czarek 想知道如何与该进程通信,以及如何在这些进程之间轻松发送 Python 数据类型。

huake_00152_.jpg

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 数据类型。