讓我描述一個例子:
import time
import threading
def some_heavy_function():
pass
while True:
t1 = threading.Thread(target=some_heavy_function, args=(,))
t2 = threading.Thread(target=some_heavy_function, args=(,))
t3 = threading.Thread(target=some_heavy_function, args=(,))
t1.start()
t2.start()
t3.start()
time.sleep(10)
我想要的是,1)我不希望每個執行緒每 10 秒重新作業一次。
每個函式都需要 10 秒以上,所以我不希望每個函式都被再次呼叫。
所以我需要使用.join().
但是,2)如果當前不作業,我希望每 10 秒再次呼叫每個函式。
在某些情況下,假設一t3開始不會被呼叫。但它應該在 10 秒后呼叫,即使t1ort2正在作業。
所以當你閱讀上面的 1) 時,你可能會建議我把
t1.join()
t2.join()
t3.join()
三秒之后.start()和之前time.sleep(10),
但這使得t3等待t1并t2完成他們的作業,所以t3即使在 10 秒后也不會被呼叫。
當然,將每個方法放在每個.join()方法之后.start()不會讓我享受多執行緒。
幫助!
uj5u.com熱心網友回復:
您需要某種控制結構(字典是理想的),您可以在其中監視執行緒的狀態。
對于每個執行緒,您需要記下它的啟動時間。通過這種方式,您可以確定它運行了多長時間。
您可以使用 Thread.is_alive() 來確定執行緒的狀態。
在這里,“重度”功能實際上是隨機睡眠一段時間。
通過列印執行緒 ID(我們自己創建)、它的睡眠持續時間和實際時間,您可以證明這滿足標準。
這段代碼需要以某種方式進行調整,因為就目前而言,它將永遠運行。
from threading import Thread
from random import randint
from time import sleep, time
def some_heavy_function(tid):
ri = randint(1, 15)
print(f'{tid} starting. Will sleep for {ri}s. Time={int(time())}')
sleep(ri)
print(f'{tid} ending')
NTHREADS = 3
TIME = 10
# tp is the thread reference
# st is the time that the thread was started
control = {f't{n}': {'tp': None, 'st': 0} for n in range(NTHREADS)}
while True:
for k, v in control.items():
if v['tp'] is not None and not v['tp'].is_alive():
v['tp'].join()
v['tp'] = None
if v['tp'] is None and time() - v['st'] > TIME:
v['tp'] = Thread(target=some_heavy_function, args=(k,))
v['st'] = time()
v['tp'].start()
sleep(1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/535805.html
上一篇:修改執行緒內的bool變數
下一篇:Jmeter:順序和并行執行
