python樹莓派通過隊列實現進程交互的程序分析
寫在前面
現在購物車有一任務需求,那就是需要進行圖像識別和運動控制,因此需要初始化2個進程,從而分別完成相應的動作。因為運動控制需要圖像識別的結果,因此現在就涉及到瞭python語法實現2個進程之間的協同合作,這篇博客就結合實際的python程序通過隊列實現進程交互通過隊列實現進程交互。
程序分析
首先介紹一下我們的需要的庫函數:
import time from multiprocessing import Process, Queue
from multiprocessing import Process, Queue
是主要的庫,作用就是提供隊列和進程操作函數,在本次測試中我們用的的進程和隊列操作函數有:
q1.get()#獲取q1隊列裡的內容 q1.put("q1 put things1")#往q1隊列裡面加入內容 p1 = Process(target=test1, args=(q1, q2))#初始化p1進程 p1.start()#啟動p1進程 p1.join()#將p1進行加入系統調度 q1.qsize()#查看q1隊列的大小
測試中的線程與進程對應關系:
q1隊列 -> q1進程 q2隊列 -> q2進程
有瞭上述的基本函數之後就可以來看我們的程序實現瞭,可以看到在程序中首先進行瞭進程的初始化,啟動和加入系統調度,運行完這些語句之後就可以認為p1和p2進程初始化好瞭。
p1 = Process(target=test1, args=(q1, q2)) p2 = Process(target=test2, args=(q1, q2)) p1.start() p2.start() p1.join() p2.join()
進程初始化完畢之後就可以來看主要的測試函數瞭,首先是test1
def test1(q1, q2): q1.put("fisrt data") while(1): s = q2.get() print('q2 left + ' + str(q2.qsize())) print('q1 get + ' + s) q1.put("q1 put things1") q1.put("q1 put things2\n") time.sleep(1)
在之前的初始化函數中,我們是先初始化瞭p1進程,也就是test1
會先運行,因此為瞭保證在開始的時候進程的隊列裡面有內容,我先在函數的最開始就在q1隊列中加入瞭內容“fisrt data”,為瞭保證測試持續進行,因此我將test1
進程設成瞭死循環,在test1
中,會先去獲取q2隊列裡的內容和q2隊列大小並打印,然後會在q1隊列中放入新的內容,請註意,這裡放入瞭2個節點的數據,分別是“q1 put things1”和“q1 put things2\n”
在這裡我提出一個問題:
那就是當p1進程去獲取q2隊列裡的內容的時候,p1進程會將q2隊列裡的全部內容都取出還是隻會取出q2隊列最前面的那個數據呢?
接下來我們就來解決一下這個問題。接下來我們來看一下test2函數裡面幹瞭些什麼:
def test2(q1, q2): while(1): s = q1.get() print('q1 left + ' + str(q1.qsize())) print('q2 get + ' + s) q2.put("q2 put data1") time.sleep(1)
在test2
函數中做的事情就比較少瞭,就是先獲取瞭q1隊列中的數據和q1剩餘隊列大小並打印,接著往q2隊列加入“q2 put data1”。
結果分析
我們來看一下main函數裡面的調用:
if __name__ == '__main__': p1 = Process(target=test1, args=(q1, q2)) p2 = Process(target=test2, args=(q1, q2)) p1.start() p2.start() p1.join() p2.join()
在main函數裡面隻是做瞭線程啟動的操作,我們再來看一下輸出結果:
從結果中我們可以很清楚的看到,q1線程每次會加入2個節點數據,然後p2進程會從q1線程中做q1.get()
的操作,隨著循環次數的不斷增加,我們可以發現q1隊列的長度不斷增加,從而我們可以得出結論:
p1進程去獲取q2隊列裡的內容的時候,p1進程會將q2隊列最前面的那個數據取出。
到此這篇關於python樹莓派通過隊列實現進程交互的程序分析的文章就介紹到這瞭,更多相關python樹莓派進程交互內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!