PyQt應用程式中的多執行緒:使用Qt還是Python執行緒?
1、問題背景
2、解決方案
-
Qt 執行緒:
-
優勢:
-
與 Qt 庫的其餘部分更好地整合。例如,Qt 中具有執行緒感知的方法需要知道它們在哪個執行緒中執行,並且要線上程之間移動物件,則需要使用 QThread。
-
另一個有用的功能是線上程中執行自己的事件迴圈。
-
-
劣勢:
-
可能無法從 Python 執行緒訪問 Qt。例如,無法透過 QApplication.postEvent 將事件釋出到主執行緒。
-
-
-
Python 執行緒:
-
優勢:
-
更簡單、更安全。由於這是一個基於 I/O 的應用程式,因此它們能夠繞過 GIL。
-
Python 執行緒是系統執行緒。但是,Python 使用全域性直譯器鎖 (GIL) 來確保一次只執行一定大小的位元組碼指令塊。幸運的是,Python 在輸入/輸出操作期間會釋放 GIL,從而使執行緒對於模擬非阻塞 I/O 很有用。
-
-
劣勢:
-
由於 Python 的內建鎖 GIL(全域性直譯器鎖),Python 執行緒不能真正併發執行 Python 程式碼,包括了呼叫 Python API 和解釋 Python 位元組碼。
-
多執行緒程式設計使應用程式複雜度大增,尤其是在處理 Python 直譯器和編譯模組程式碼之間的本來就複雜的互動時。
-
-
-
非阻塞 I/O:
-
透過非同步 I/O,可以始終確保每個開啟的檔案描述符的執行路徑一致且有序。
-
例如:
-
QNetworkAccessManager:如果應用程式正在訪問 HTTP 伺服器,則應該考慮 QNetworkAccessManager。
-
Twisted 或非阻塞套接字/select:可以考慮使用 Twisted 或非阻塞套接字/select 實現非阻塞 I/O。
-
Diesel 庫:它目前僅限於 Linux,但它的速度非常快且非常優雅。
-
pyevent:它是 libevent 庫的包裝器,它提供了一個基本框架,用於使用系統最快的可用方法(在編譯時確定)進行基於事件的程式設計。
-
-
在 PyQt 應用程式中使用執行緒時,需要考慮以下幾點:
-
如果需要從執行緒內更新 GUI,則應使用 Qt-4 的佇列連線訊號,以便輕鬆地跨執行緒傳送資料,並且如果使用 QThread,則會自動呼叫它們;不確定如果使用 Python 執行緒是否會呼叫它們,儘管很容易為 connect() 新增一個引數。
-
只有一個主執行緒可以進行任何 GUI 更新。
-
Qt 執行緒與 Python 執行緒的主要區別在於,Qt 執行緒更好地整合到 Qt 庫的其餘部分。也就是說,Qt 中的執行緒感知方法需要知道它們在哪個執行緒中執行,並且要線上程之間移動物件,則需要使用 QThread。
-
Qt 執行緒在沒有 Global Interpreter Lock 的情況下執行,因此能夠併發執行。
-
Python 執行緒不需要 Global Interpreter Lock,因此能夠併發執行。
-
如果 Qt 執行緒不呼叫 Python 程式碼,則它們應該能夠併發執行(除了可能在各種結構中實現的各種額外鎖之外)。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70034537/viewspace-3006832/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Qt 中的多執行緒QT執行緒
- qt多執行緒QT執行緒
- redis自學(22)Redis是單執行緒還是多執行緒?Redis執行緒
- Qt中的多執行緒與執行緒池淺析+例項QT執行緒
- 多執行緒應用執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- python中多執行緒和多程序的應用Python執行緒
- python多執行緒中:如何關閉執行緒?Python執行緒
- Qt 中多執行緒對應的訊號槽QT執行緒
- Python——程式、執行緒、協程、多程式、多執行緒(個人向)Python執行緒
- 【QT】 Qt多執行緒的“那些事”QT執行緒
- 多執行緒-程式和執行緒的概述執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- ObjC 多執行緒簡析(一)-多執行緒簡述和執行緒鎖的基本應用OBJ執行緒
- 執行緒以及多執行緒,多程式的選擇執行緒
- Qt---多執行緒控制QT執行緒
- Python 多執行緒多程式Python執行緒
- 面試官問,Redis 是單執行緒還是多執行緒?我懵了面試Redis執行緒
- C#中的執行緒(三)多執行緒C#執行緒
- python多執行緒程式設計3: 使用互斥鎖同步執行緒Python執行緒程式設計
- java多執行緒之執行緒的基本使用Java執行緒
- 多執行緒-執行緒組的概述和使用執行緒
- 多執行緒-執行緒池的概述和使用執行緒
- python多執行緒程式設計1— python對多執行緒的支援Python執行緒程式設計
- 多執行緒程式設計基礎(一)-- 執行緒的使用執行緒程式設計
- 多執行緒【執行緒池】執行緒
- 多執行緒--執行緒管理執行緒
- Java多執行緒——執行緒Java執行緒
- 執行緒與多執行緒執行緒
- 多執行緒-執行緒控制之休眠執行緒執行緒
- 多執行緒-執行緒控制之加入執行緒執行緒
- 多執行緒-執行緒控制之禮讓執行緒執行緒
- 多執行緒-執行緒控制之中斷執行緒執行緒
- 使用執行緒池優化多執行緒程式設計執行緒優化程式設計
- Java 程式中的多執行緒Java執行緒
- 執行緒池中多餘的執行緒是如何回收的?執行緒
- ArcGISEngine中的多執行緒使用執行緒
- Linux下應用程式開發:QT中的多執行緒程式設計(轉)LinuxQT執行緒程式設計