2011-11-24 104 views
6

我想寫一個利用並行處理/線程讀取兩個串行端口(/ dev/ttyS1和/ dev/ttyS2)的python類。這兩個端口都以19200波特率運行,並始終處於活動狀態。我爲此使用了pySerial。Python多線程/多進程讀取串行端口

這兩種讀取操作都需要連續並行運行。我想知道是否應該使用線程庫或線程庫或多處理庫。我只是擔心,因爲全局解釋器鎖並不能爲重IO操作提供真正的線程能力。但是,如果全局解釋器鎖不會影響我,那麼我將使用線程/線程模塊。但是,如果它確實如此,那麼我需要交叉編譯python多處理庫,因爲這是在嵌入式系統上。

所以我的代碼通常會有 thread1或process1 =讀取ttyS1並在讀取行上執行一些字符串操作後寫入緩衝區。 thread2或process2 =讀取ttyS2並在讀取線上執行一些字符串操作後寫入另一個緩衝區。 其他功能等 這些緩衝區被代碼中的其他部分進一步利用。

python中的多處理還需要多個核心/ cpus嗎?

感謝您的閱讀!

回答

1

GIL在讀取操作期間被釋放,所以它不應該影響你很多。 交叉編譯multiprocessing聽起來像過度殺傷,或至少過早優化。 儘管如此,請保持代碼模塊化,以便可以在之間切換。

我確實相信線程的性能取決於您的操作系統。您的里程會有所不同,特別是在嵌入式系統上。

如果您有一個小時的空閒時間,David Beazley的talk on the GIL(PDF幻燈片here)。對於高性能的線程,你會希望看到它獲得線程,GIL和操作系統如何共同工作以殺死性能的令人討厭的細節。

+0

感謝有關GIL發佈的信息。不適合使用的嵌入式系統將採用arm5tel架構的550 MHz CPU。我想我只是不得不做一些基準測試,看看我能從中得到多少。也感謝視頻生病看看它! – kal

1

我不是這方面的專家,但我一直髮現使用threading需要的額外細節的數量是不值得的,如果我可以通過流程並行化。

您沒有提到的替代方案中的第三個模塊是subprocess

根據OP的要求編輯:您可以通過爲串行接口創建單獨的腳本來實現並行處理。這是一個快速演示,它假定兩個文件都在同一個目錄中。

文件com.py - 串行腳本 - 這只是一個模擬的,但這裏的想法是,腳本獨立經營,並且只使用標準輸入標準輸出與主控程序進行通信。

import sys 

counter = 0 
while True: # The program never ends... will be killed when master is over. 
    counter += 1 
    sys.stdin.readline() 
    sys.stdout.write('Serial from com1 is %d\n' % counter) 
    sys.stdout.flush() 

文件master.py - 主程序

from subprocess import Popen, PIPE 
from time import sleep 

p = Popen(['python', './com.py'], stdin=PIPE, stdout=PIPE, stderr=PIPE) 
print "serial communication started." # com.py is working but we moved on! 
for i in range(3): 
    p.stdin.write('<command-here>\n') 
    print "comand sent." 
    print "received : %s" % p.stdout.readline() 
    sleep(1) 

最後,這是預期輸出的轉儲:

[email protected]:~/Desktop$ ./master.py 
serial communication started. 
comand sent. 
received : Serial from com1 is 1 
comand sent. 
received : Serial from com1 is 2 
comand sent. 
received : Serial from com1 is 3 

HTH!

+0

你能幫我理解子過程對我的場景有何用處?非常感謝你! – kal

+0

@kal - 完成。查看修改。 – mac

+0

非常感謝。這解決了我的麻煩。 – kal