2012-10-22 52 views
5

我即將開始使用Python進行輪詢的程序,它將不斷從串口讀取(通過PySerial)並從文件描述符中讀取,該文件描述符將從時間更改爲時間。我開始研究threading模塊,但隨後我一直髮現moremore建議使用multiprocessing模塊來代替。線程與Python中的進程

我不太熟悉Python,主要來自C背景。 Python中的線程方法的技術優勢是什麼?

在C中,線程共享數據,而不得不建立一些IPC進行通信,這對Python來說似乎是相同的?

我用例:

Main process (or thread?) - 
    start & initialize 
     | 
     V 
    spaw child----------------------> start & initialize 
     |         | 
     V         V 
     while (1) <------------+   wait for data<------+ 
     |      |    |    | 
     V      |    V    | 
    read file descriptors  |   read from   | 
     |      |   serial port<-----+ | 
     V      |    |   | | 
    value changed? ------No--+    V   | | 
     |     ^  message done?--No-+ | 
     V      |    |    | 
    Report change------------+    V    | 
    over serial      alert parent---------+ 

所以我就在想線程,因爲它將使共享數據拿到過串行些,他們可以有一個共同的句柄串行端口。這是否有意義,還是我從Pythonic的角度來錯誤地思考這個問題?

+1

多處理是一種(稍顯笨重的恕我直言)迴避GIL的方式。在這種情況下,我認爲「線程化」是要走的路。 – mgilson

+0

@Downvoter - 我可以有一個原因,你爲什麼覺得這個問題:「不顯示研究工作,它不清楚或沒有用」? – Mike

回答

11

multiprocessing主要在Python中用於避免GIL(全局解釋器鎖),它會停止線程對於嘗試並行計算有用 - 對於資源訪問,線程是完美的,並且更易於實現。

GIL意味着只有一個線程可以同時在任何Python對象上運行。這意味着,當你試圖加速計算時,進程將受到其他線程的阻礙。在你的用例中,一個線程只會檢查新的輸入,所以這根本不會引起任何問題。

+0

真棒回答謝謝。我想我需要再看看GIL。對我來說這是一個新概念。 – Mike

+2

這是CPython的一個實現細節,人們真的太想起來了 - 在99%的情況下,真的沒關係。 –