2017-02-14 101 views
0

用於從外部裝置(多線程/定時)採樣「正確」的過程我開發,其中我從BLE設備在約50-200Hz的速率採樣的數據的Python腳本。截至目前,我正在做這個同步:在Python

while True: 
    if time_now > time_before + (1/sample_rate): 
    do_stuff() 

這個偉大的工程,除了一個事實,即它完全阻塞線程和其他應用程序(如果我想用Qt的圖形用戶界面,例如結合)。什麼是正確的方式去解決這個問題?

  • 我可以輕鬆實現多線程設置,其中每個「採樣器」(while循環)都有自己的線程嗎?
  • 我應該實現定時器操作,以及如何確保腳本不殺死在等待新的樣本?

我的問題類似於this,但是,它是針對C#的。

+0

我將在一個專用線程輪詢過程中分離,這將寫出樣品某處(存儲器,隊列,等等。),然後,在應用程序的其他部分,可用的時候我會閱讀的那些樣品。 的優點是硬件故障/塊不會阻止你的腳本邏輯 – BeerBaron

+0

你需要在所有民意調查?設備是否不實施通知,以便每當特徵發生變化時都會異步並自動地通知您?查看BLE示例以瞭解如何爲給定特性啓用更改通知。 –

回答

0

我愛的Javascript setInterval的模式,我的猜測是,這更像是你想要的。

import threading 

def setInterval(func,time): 
    e = threading.Event() 
    while not e.wait(time): 
     func() 

def foo(): 
    print "do poll here" 

# using 
setInterval(foo,5) 

https://stackoverflow.com/a/39842247/1598412

1

如果採樣本身並不需要太多的時間,你可以使用一個QTimer並做抽樣在超時的插槽。如果需要在I/O上阻塞很多時間並且不執行Python代碼,則應該使用一個線程來進行輪詢並使用信號將結果發送到主線程。 如果抽樣使用大量時間執行python代碼,由於GIL(全局解釋器鎖),您對大多數python實現運氣不佳。在大多數python實現中,只有一個線程可以主動執行python代碼。所以pyhton中真正的並行性通常是通過創建新進程而不是新線程來完成的。