PySide多進(jìn)程通訊之QLocalServer
環(huán)境
PySide6
Python3.8
Win 11
PySide是Qt框架的官方Python語言的綁定。以下Qt。
Qt常用的進(jìn)程間通訊模式很多,以下是個人比較常用的。:
socket(套接字)通訊 QLocalServer 對于標(biāo)準(zhǔn)庫的? socket
管道和隊列, multiprocessing.Pipe, multiprocessing.Queue 之類
共享內(nèi)存? QSharedMemory 對應(yīng)標(biāo)準(zhǔn)庫
multiprocessing.shared_memory
模塊
本篇是關(guān)于多進(jìn)程套接字通訊的基本使用的
主要用到兩個類
QLocalServer
QLocalSocket
分別相當(dāng)于服務(wù)端和客戶端。
和標(biāo)準(zhǔn)的socket不同,Qt的本地套接字通訊要簡單的多。
由于我們常見的場景主要是從子進(jìn)程獲取輸出,所以這里主進(jìn)程使用QLocalServer, 子進(jìn)程使用QLocalSocket
先說主進(jìn)程部分的 QLocalServer, 用過標(biāo)準(zhǔn)庫的 selectors 模塊的應(yīng)該比較熟悉。一般服務(wù)端套接字的處理過程分2個步驟:
接受一個客戶端的連接。
監(jiān)聽次客戶端發(fā)來的數(shù)據(jù)
QT使用信號機(jī)制來完成以上的2個步驟。相對于標(biāo)準(zhǔn)庫的 selectors,寫法上更簡潔。
先介紹2個信號
QLocalServer.newConnection? 表示此時有客戶端連接到服務(wù)端
QLocalSocket.readRead 表示socket有數(shù)據(jù)到來,可以進(jìn)行讀取
服務(wù)端函數(shù)
首先創(chuàng)建一個 QLocalServer 對象
然后注冊客戶端連接信號,并在客戶端連接信號的槽函數(shù)里,為客戶端的readyRead信號注冊一個讀取數(shù)據(jù)的槽函數(shù)
# 創(chuàng)建一個 QLocalServer 對象, 其本身雖然不是繼承于QThread,但其行為類似線程/事件循環(huán)
class SomethingQ(QDalog):
?
?...
?def run_server(self):
? ?self.server = QLocalServer() ?
? ?# 注冊連接信號, 類似于 selectors 里面的 accept_cli
? ?self.server.newConnection.connect(self.new_connection)
? ?self.server.listen("hello") ?# 開始監(jiān)聽
?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):
? ? ?# 從客戶端讀取數(shù)據(jù),類似 selectors 里面的 read_cli
? ? ?data = sock.readAll() ?# 讀取全部數(shù)據(jù)
? ? ?...
客戶端函數(shù)
QLocalSocket的使用和標(biāo)準(zhǔn)庫的socket很像,不過連接服務(wù)端使用的不是ip和端口而是字符串。
client.connect_server("your server name")
然后就可以使用 writeData 或者 write 函數(shù)寫入數(shù)據(jù)了,2個函數(shù)的區(qū)別是前者是2個參數(shù),第一個參數(shù)是字節(jié),第二個參數(shù)是發(fā)送的數(shù)據(jù)長度,而后者只有第一個參數(shù)。
sock.writeData(data_bytes, len(mes)) ?# 方法1
# sock.write(data_bytes) ?# 方法2
【PySide多進(jìn)程通訊之QLocalServer-嗶哩嗶哩】 https://b23.tv/0dMnKnE