如主題所述,以往利用python收集感測器資料時,都是使用While True: 這種方式,不斷重複執行,將感測器收到的最新資料,存入資料庫,問題來了,如果今天我還有額外的程式需要運作,不能總讓程式卡在while迴圈裡,所以想請教一下,有甚麼推薦的做法嗎?另外請問一下threading 模組這種多線程的方式,可以同時執行多個任務,互不干擾,是不是就是最佳解?問題很菜,多多包涵。以下附上隨機生成的數值為範例
from bluepy import btle
import random
import time
import datetime
from pymongo import MongoClient
client = MongoClient('mongodb://localhost:27017/')
db = client['admin']
list1 = []
while True:
Yaw=round(random.uniform(-1,1),2)
Pitch=round(random.uniform(-1,1),2)
Roll=round(random.uniform(-1,1),2)
Ax=round(random.uniform(-1,1),2)
Ay=round(random.uniform(-1,1),2)
Az=round(random.uniform(-1,1),2)
Gx=round(random.uniform(-1,1),2)
Gy=round(random.uniform(-1,1),2)
Gz=round(random.uniform(-1,1),2)
Mx=round(random.uniform(-1,1),2)
My=round(random.uniform(-1,1),2)
Mz=round(random.uniform(-1,1),2)
Temp=round(random.uniform(-1,1),2)
list1 = [Yaw,Pitch,Roll,Ax,Ay,Az,Gx,Gy,Gz,Mx,My,Mz,Temp]
post = {"Yaw": Yaw,
"Pitch": Pitch,
"Roll": Roll,
"Ax": Ax,
"Ay": Ay,
"Az": Az,
"Gx": Gx,
"Gy": Gy,
"Gz": Gz,
"Mx": Mx,
"My": My,
"Mz": Mz,
"Temp": Temp
}
posts = db.posts
post_id = posts.insert_one(post).inserted_id
print (" id is ", post_id)
print (list1)
time.sleep(5)
有考慮過把while True包在外面嗎?
如果你是想再post之後再針對那些數據做其他事情,只要把數據return出來,或是用其他方式keep住就可以接著處理了,while True包在外面,可以視為每一個run你要做post_data()與other_things()各一次,應該可以符合你的需求
from bluepy import btle
import random
import time
import datetime
from pymongo import MongoClient
client = MongoClient('mongodb://localhost:27017/')
db = client['admin']
list1 = []
def post_data():
Yaw=round(random.uniform(-1,1),2)
# 省略...
time.sleep(5)
def other_things():
# 你想做的其他事情
if __name__ == '__main__':
while True:
post_data()
other_things()
P大,請教一下,如果其中一個function是非同步結構async def other_things():
,那這種結構,還能使用嗎?
可能要玩玩看才會知道,但如果用到asyncio的話,整個架構應該都會不一樣,就不是while True的問題了
參考:
asynocio
P大,好的,謝謝回覆,我已經測試好了,最後用類似的方法成功了,感恩。
這種事得要先說明單一執行及複合式執行。
並不是用 「While True 」就只能單一執行。
你也可以在其迴圈內做事件判斷。
用迴圈來決定要執行啥事。只是要非常注意一件事。
單線程運行的問題。
所謂單線程運行的問題,是指當同時符合5個事件要運行時。
則會先跑1完後再跑2...依序運行下來。
這在某些情況下並不太適合。
除非你能做到多線程運行。正常我會做的是呼叫運行。而非直接運行。
你提到的多線程運行,主要就是為了這些事。