iT邦幫忙

0

python如何擺脫while true(新手提問)[已解決]

  • 分享至 

  • xImage

如主題所述,以往利用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)
看更多先前的討論...收起先前的討論...
ragequit iT邦新手 5 級 ‧ 2022-03-30 15:49:04 檢舉
flag = true
while迴圈裡面寫判斷式
if .... :
flag = false
froce iT邦大師 1 級 ‧ 2022-03-30 16:30:06 檢舉
threading 或 async都可以,不過你的情景比較適合 threading
andow1198 iT邦新手 4 級 ‧ 2022-03-31 09:15:30 檢舉
F大,謝謝建議,感恩
andow1198 iT邦新手 4 級 ‧ 2022-03-31 09:18:18 檢舉
R大,我的情況是在不能跳出迴圈的前提下,同時運作多個任務,這種條件迴圈跳出來後,我可以再跳回去迴圈嗎?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
Peter
iT邦新手 4 級 ‧ 2022-03-31 11:00:33
最佳解答

有考慮過把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()
        
看更多先前的回應...收起先前的回應...
andow1198 iT邦新手 4 級 ‧ 2022-03-31 13:16:46 檢舉

P大, 對!! 我想這應該是我取代我原程式或是多線程的好方法

andow1198 iT邦新手 4 級 ‧ 2022-04-01 15:41:10 檢舉

P大,請教一下,如果其中一個function是非同步結構async def other_things(): ,那這種結構,還能使用嗎?

Peter iT邦新手 4 級 ‧ 2022-04-06 09:12:09 檢舉

可能要玩玩看才會知道,但如果用到asyncio的話,整個架構應該都會不一樣,就不是while True的問題了

參考:
asynocio

andow1198 iT邦新手 4 級 ‧ 2022-04-06 16:33:06 檢舉

P大,好的,謝謝回覆,我已經測試好了,最後用類似的方法成功了,感恩。/images/emoticon/emoticon37.gif

1

這種事得要先說明單一執行及複合式執行。

並不是用 「While True 」就只能單一執行。
你也可以在其迴圈內做事件判斷。
用迴圈來決定要執行啥事。只是要非常注意一件事。
單線程運行的問題。

所謂單線程運行的問題,是指當同時符合5個事件要運行時。
則會先跑1完後再跑2...依序運行下來。
這在某些情況下並不太適合。

除非你能做到多線程運行。正常我會做的是呼叫運行。而非直接運行。

你提到的多線程運行,主要就是為了這些事。

andow1198 iT邦新手 4 級 ‧ 2022-03-31 09:19:39 檢舉

浩瀚大大,謝謝你的說明,我大概能理解觀念了

2
海綿寶寶
iT邦大神 1 級 ‧ 2022-03-30 17:18:11

Google 一個python/Arduino/asyncio 的範例供參考

andow1198 iT邦新手 4 級 ‧ 2022-03-31 09:20:18 檢舉

海綿大,感謝支援!!/images/emoticon/emoticon41.gif

我要發表回答

立即登入回答