我是佇列和執行緒的新手,請幫助使用以下代碼,在這里我正在嘗試執行函式hd,我需要多次運行該函式,但僅在一次運行完成后
import queue
import threading
import time
fifo_queue = queue.Queue()
def hd():
print("hi")
time.sleep(1)
print("done")
for i in range(3):
cc = threading.Thread(target=hd)
fifo_queue.put(cc)
cc.start()
電流輸出
hi
hi
hi
donedonedone
預期產出
hi
done
hi
done
hi
done?
uj5u.com熱心網友回復:
您可以將信號量用于您的目的
信號量管理一個內部計數器,該計數器隨每次acquire() 呼叫而遞減,并隨每次release() 呼叫而遞增。計數器永遠不會低于零;當acquire() 發現它為零時,它會阻塞,等待其他執行緒呼叫release()。
Semaphore 的默認值是1,
類 threading.Semaphore(value=1)
所以一次只有一個執行緒處于活動狀態:
import queue
import threading
import time
fifo_queue = queue.Queue()
semaphore = threading.Semaphore()
def hd():
with semaphore:
print("hi")
time.sleep(1)
print("done")
for i in range(3):
cc = threading.Thread(target=hd)
fifo_queue.put(cc)
cc.start()
hi
done
hi
done
hi
done
正如@user2357112supportsMonica在評論中提到的,RLock將是更安全的選擇
執行緒類.RLock
此類實作可重入鎖物件。重入鎖必須由獲取它的執行緒釋放。一旦一個執行緒獲得了可重入鎖,同一個執行緒就可以再次獲得它而不會阻塞;執行緒每次獲得它時必須釋放它一次。
import queue
import threading
import time
fifo_queue = queue.Queue()
lock = threading.RLock()
def hd():
with lock:
print("hi")
time.sleep(1)
print("done")
for i in range(3):
cc = threading.Thread(target=hd)
fifo_queue.put(cc)
cc.start()
uj5u.com熱心網友回復:
請在睡覺前列印(“向下”)。它會正常作業。原因:你的程式會這樣做: thread1
: print
sleep
print 但當執行緒處于睡眠狀態時,其他執行緒將作業并列印它們的第一個命令。以我的方式,執行緒將寫入第一個,寫入第二個,然后進入睡眠狀態并等待其他執行緒出現。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/399901.html
上一篇:如何從run()方法訪問變數?
