我正在使用一個簡單的 Python 腳本來控制傳感器并從該傳感器讀取測量值。我想同時進行不同的測量型別,下面的功能可以用于每種型別的測量:
def measure(measurement_type, num_iterations):
file = open(measurement_type, 'w')
writer = csv.writer(file)
for i in range(num_iterations):
pm2.5, pm10 = sensor.query()
writer.writerow(pm2.5, pm10, curr_time())
time.sleep(60)
file.close()
upload_data(file, measurement_type)
我嘗試在不同的執行緒上呼叫此函式的多次呼叫,以獲得描述各種時間背景關系(每小時、每天、每周等)的測量值的檔案:
if __name__ == '__main__':
sensor = SDS011("/dev/ttyUSB0")
sensor.sleep(sleep=False)
print("Preparing sensor...")
time.sleep(15)
print("Sensor is now running:")
try:
while True:
Thread(target=take_measurements('hourly', 60)).start()
Thread(target=take_measurements('daily', 1440)).start()
Thread(target=take_measurements('weekly', 10080)).start()
Thread(target=take_measurements('monthly', 43800)).start()
except KeyboardInterrupt:
clean_exit()
這些執行緒中只有一個在給定時間運行,而執行哪個執行緒似乎是隨機的。值得注意的是,此腳本在 RaspberryPi 上運行。我的第一個想法是嘗試訪問傳感器的多個執行緒可能會產生競爭條件,但如果發生這種情況,我不希望腳本繼續運行任何執行緒。
uj5u.com熱心網友回復:
當您在目標操作中直接呼叫您的函式時,Python 將首先嘗試評估您的函式回傳的內容并執行其代碼。有一種特殊的方法可以向執行緒模塊指示您需要一些函式引數,并且在您啟動執行緒之前不要呼叫您的函式。希望下面的例子有幫助:
from time import sleep
from random import randint
from threading import Thread
def something(to_print):
sleep(randint(1,3))
print(to_print)
threadlist = []
threadlist.append(Thread(target=something, args=["A"]))
threadlist.append(Thread(target=something, args=["B"]))
threadlist.append(Thread(target=something, args=["C"]))
for thread in threadlist:
thread.start()
這將每次回傳不同的值:
(.venv) remzi in ~/Desktop/playground > python test.py
A
C
B
(.venv) remzi in ~/Desktop/playground > python test.py
C
A
B
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/529412.html
標籤:Pythonpython-3.x多线程树莓派4python-theano
上一篇:執行緒鎖定似乎無法始終如一地作業
下一篇:PHP和子行程
