我有一套我的程式與之通信的工具,我想把通信放在一個單獨的執行緒中。
IO 非常慢(每個儀器每個專案約 100 毫秒),我需要將它們的結果值記錄在一個共享陣列(最后 N 個值)中并保存到一個檔案中,并盡快重復測量. 一些儀器“制定”回應的速度很慢,因此可以同時進行一些讀數,但讀數需要大致同步(即每行讀數有 1 個時間戳)
我希望這一切都在一個單獨的執行緒中完成,因此主執行緒中發生的計算等不會中斷時間,但主執行緒應該能夠訪問陣列。
理想情況下,我應該能夠運行一些daq.start()并且無需進一步互動即可運行。
這樣做的“pythonic”方法是什么?我一直在閱讀有關異步、執行緒和多處理的內容,但我不清楚哪個是合適的。
在 c 中,我將啟動 thread1,它只會將測量值按順序記錄到快取陣列中。只要 thread2 獲得鎖,它就會將該快取重繪 到主共享陣列中。同時它會將其寫入輸出檔案。通過跟蹤正在讀取的索引范圍,鎖沖突將很少見(但重要的是當它們發生時不會中斷 DAQ)
uj5u.com熱心網友回復:
這里的正確答案是執行緒,這不是一個意見。
與硬體的通信是使用在 DLL 中實作的驅動程式完成的,當 python 呼叫 DLL 時,它會丟棄 GIL,因此執行緒可以在后臺執行,而 python 解釋器本身的開銷盡可能少。
應該進行適當的同步,如果寫入檔案是使用執行緒完成的,其中包括執行緒鎖,但在寫入檔案時,執行緒將丟棄 GIL,并且它們在您的 python 解釋器上仍然幾乎沒有開銷。
上述兩種情況都不適用于 asyncio,它是為異步網路設計的,而不是硬體。
對于實作,執行緒池通常是最 Pythonic 的方式,您只需生成與您連接的儀器數量一樣多的作業人員并讓他們完成作業。
由于您沒有使用任何 asyncio 功能,因此您應該使用multiprocesing.threadpool和apply_asyncorimap_unordered以及threading 模塊中的執行緒鎖來寫入磁盤,如果您想在所有執行緒中同步每個幀,也存在障礙。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/517045.html
標籤:Python多线程io
