欢迎光临散文网 会员登陆 & 注册

PySide多进程通讯之QLocalServer

2023-08-26 14:34 作者:宝宝龙的爸爸  | 我要投稿

环境

  • 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个步骤:

  1. 接受一个客户端的连接。

  2. 监听次客户端发来的数据

QT使用信号机制来完成以上的2个步骤。相对于标准库的 selectors,写法上更简洁。

先介绍2个信号

  • QLocalServer.newConnection  表示此时有客户端连接到服务端

  • QLocalSocket.readRead 表示socket有数据到来,可以进行读取


服务端函数

  1. 首先创建一个 QLocalServer 对象

  2. 然后注册客户端连接信号,并在客户端连接信号的槽函数里,为客户端的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

PySide多进程通讯之QLocalServer的评论 (共 条)

分享到微博请遵守国家法律