lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
class Thread(QRunnable)。
def __init__(self):
super(Thread, self).__init__()
self.mutex = QMutex()
def run(self)。
self.mutex.lock()
lst.pop(0)
print(str(lst))
time.sleep(5)
self.mutex.unlock()
上面的代碼是我想實作的一個例子,我有一個定義在類之外的串列。我想周期性地彈出串列的第一個元素。如果我正在運行5個執行緒,我只想讓一個執行緒在單一時間內突變串列。每次我嘗試這樣做時,5個執行緒都試圖彈出第一個元素,而沒有按照我的要求等待。當我在原生的Python執行緒庫中重新創建時,它就會按計劃作業。我在這里做錯了什么呢?
uj5u.com熱心網友回復:
問題在于,你為每個執行緒創建了一個互斥鎖。一個互斥鎖只能保護使用相同互斥鎖的執行緒。因為每個執行緒都在使用自己的私有鎖,所以它只能保護自己。根據@eyllanesc的回答,我已經創建了一個單一的mutex,供所有執行緒使用。這個mutex應該被認為是與它所保護的資料相關的。
import sys
import time
from PyQt6.QtCore import QCoreApplication, QMutex, QRunnable, QThreadPool, QTimer
# 帶mutex訪問控制的資料 1, 2, 3, 4, 5, 6, 7, 8, 9]
class Thread(QRunnable)。
def run(self)。
#mutex = QMutex() <--不要創建一個私有的mutex。
mutex.lock()
lst.pop(0)
print(lst, time.time()-start, flush=True)
time.sleep(5)
mutex.unlock()
start = time.time()
def main()。
app = QCoreApplication(sys.argv)
QTimer.singleShot(8 * 1000, QCoreApplication.quit)
pool = QThreadPool()
for i in range(5)。
runnable = Thread()
pool.start(runnable)
sys.exit(app.exec())
if __name__ == "__main__"/span>:
main()
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/308335.html
標籤:
