PySide多进程通讯之QLocalServer
环境
PySide6
Python3.8
Win 11
PySide是Qt框架的官方Python语言的绑定。以下Qt。
Qt常用的进程间通讯模式很多,以下是个人比较常用的。:
socket(套接字)通讯 QLocalServer 对于标准库的 socket
管道和队列, multiprocessing.Pipe, multiprocessing.Queue 之类
共享内存 QSharedMemory 对应标准库
multiprocessing.shared_memory
模块
本篇是关于多进程套接字通讯的基本使用的
主要用到两个类
QLocalServer
QLocalSocket
分别相当于服务端和客户端。
和标准的socket不同,Qt的本地套接字通讯要简单的多。
由于我们常见的场景主要是从子进程获取输出,所以这里主进程使用QLocalServer, 子进程使用QLocalSocket
先说主进程部分的 QLocalServer, 用过标准库的 selectors 模块的应该比较熟悉。一般服务端套接字的处理过程分2个步骤:
接受一个客户端的连接。
监听次客户端发来的数据
QT使用信号机制来完成以上的2个步骤。相对于标准库的 selectors,写法上更简洁。
先介绍2个信号
QLocalServer.newConnection 表示此时有客户端连接到服务端
QLocalSocket.readRead 表示socket有数据到来,可以进行读取
服务端函数
首先创建一个 QLocalServer 对象
然后注册客户端连接信号,并在客户端连接信号的槽函数里,为客户端的readyRead信号注册一个读取数据的槽函数
# 创建一个 QLocalServer 对象, 其本身虽然不是继承于QThread,但其行为类似线程/事件循环
class SomethingQ(QDalog):
...
def run_server(self):
self.server = QLocalServer()
# 注册连接信号, 类似于 selectors 里面的 accept_cli
self.server.newConnection.connect(self.new_connection)
self.server.listen("hello") # 开始监听
def new_connection(self):
# 取出客户端
sock: QLocalSocket = self.server.nextPendingConnection()
# 注册客户端的readyRead信号,类似 selectors 里面的 read_cli
sock.readyRead.connect(partial(self.ready_read, sock=sock))
def ready_read(self, sock: QLocalSocket):
# 从客户端读取数据,类似 selectors 里面的 read_cli
data = sock.readAll() # 读取全部数据
...
客户端函数
QLocalSocket的使用和标准库的socket很像,不过连接服务端使用的不是ip和端口而是字符串。
client.connect_server("your server name")
然后就可以使用 writeData 或者 write 函数写入数据了,2个函数的区别是前者是2个参数,第一个参数是字节,第二个参数是发送的数据长度,而后者只有第一个参数。
sock.writeData(data_bytes, len(mes)) # 方法1
# sock.write(data_bytes) # 方法2
【PySide多进程通讯之QLocalServer-哔哩哔哩】 https://b23.tv/0dMnKnE