寫在前面
現(xiàn)在購物車有一任務(wù)需求,那就是需要進行圖像識別和運動控制,因此需要初始化2個進程,從而分別完成相應(yīng)的動作。因為運動控制需要圖像識別的結(jié)果,因此現(xiàn)在就涉及到了python語法實現(xiàn)2個進程之間的協(xié)同合作,這篇博客就結(jié)合實際的python程序通過隊列實現(xiàn)進程交互通過隊列實現(xiàn)進程交互。
程序分析
首先介紹一下我們的需要的庫函數(shù):
import time
from multiprocessing import Process, Queue
from multiprocessing import Process, Queue
是主要的庫,作用就是提供隊列和進程操作函數(shù),在本次測試中我們用的的進程和隊列操作函數(shù)有:
q1.get()#獲取q1隊列里的內(nèi)容
q1.put("q1 put things1")#往q1隊列里面加入內(nèi)容
p1 = Process(target=test1, args=(q1, q2))#初始化p1進程
p1.start()#啟動p1進程
p1.join()#將p1進行加入系統(tǒng)調(diào)度
q1.qsize()#查看q1隊列的大小
測試中的線程與進程對應(yīng)關(guān)系:
q1隊列 -> q1進程
q2隊列 -> q2進程
有了上述的基本函數(shù)之后就可以來看我們的程序?qū)崿F(xiàn)了,可以看到在程序中首先進行了進程的初始化,啟動和加入系統(tǒng)調(diào)度,運行完這些語句之后就可以認為p1和p2進程初始化好了。
p1 = Process(target=test1, args=(q1, q2))
p2 = Process(target=test2, args=(q1, q2))
p1.start()
p2.start()
p1.join()
p2.join()
進程初始化完畢之后就可以來看主要的測試函數(shù)了,首先是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)
在之前的初始化函數(shù)中,我們是先初始化了p1進程,也就是test1
會先運行,因此為了保證在開始的時候進程的隊列里面有內(nèi)容,我先在函數(shù)的最開始就在q1隊列中加入了內(nèi)容“fisrt data”,為了保證測試持續(xù)進行,因此我將test1
進程設(shè)成了死循環(huán),在test1
中,會先去獲取q2隊列里的內(nèi)容和q2隊列大小并打印,然后會在q1隊列中放入新的內(nèi)容,請注意,這里放入了2個節(jié)點的數(shù)據(jù),分別是“q1 put things1”和“q1 put things2\n”
在這里我提出一個問題:
那就是當(dāng)p1進程去獲取q2隊列里的內(nèi)容的時候,p1進程會將q2隊列里的全部內(nèi)容都取出還是只會取出q2隊列最前面的那個數(shù)據(jù)呢?
接下來我們就來解決一下這個問題。接下來我們來看一下test2函數(shù)里面干了些什么:
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
函數(shù)中做的事情就比較少了,就是先獲取了q1隊列中的數(shù)據(jù)和q1剩余隊列大小并打印,接著往q2隊列加入“q2 put data1”。
結(jié)果分析
我們來看一下main函數(shù)里面的調(diào)用:
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函數(shù)里面只是做了線程啟動的操作,我們再來看一下輸出結(jié)果:
從結(jié)果中我們可以很清楚的看到,q1線程每次會加入2個節(jié)點數(shù)據(jù),然后p2進程會從q1線程中做q1.get()
的操作,隨著循環(huán)次數(shù)的不斷增加,我們可以發(fā)現(xiàn)q1隊列的長度不斷增加,從而我們可以得出結(jié)論:
p1進程去獲取q2隊列里的內(nèi)容的時候,p1進程會將q2隊列最前面的那個數(shù)據(jù)取出。
到此這篇關(guān)于python樹莓派通過隊列實現(xiàn)進程交互的程序分析的文章就介紹到這了,更多相關(guān)python樹莓派進程交互內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- 樹莓派升級python的具體步驟
- 樹莓派4B+opencv4+python 打開攝像頭的實現(xiàn)方法
- 樹莓派使用python-librtmp實現(xiàn)rtmp推流h264的方法
- 樹莓派用python中的OpenCV輸出USB攝像頭畫面
- 在樹莓派2或樹莓派B+上安裝Python和OpenCV的教程