3

我上的覆盆子PI我應該使用哪個線程或進程?

while(true): 
    functionA 
    functionB 

功能A Python寫一個代碼基本上是,在PNG格式捕獲圖像的命令。我不希望它是一個阻塞功能。我希望我的代碼繼續執行功能B,同時功能A捕獲圖像並使數據準備好進行下一次運行。

我很困惑是否使用線程或進程。

如果我必須使用一個線程,它何時會停止? 在函數A完成它的執行之後它會停止一次嗎?在那種情況下,每次我必須啓動這個線程時,我需要調用start方法? 或者我應該使用一個流程,我將如何處理它,這意味着流程何時停止。

+0

使用線程,而不是進程。 –

+0

讓我們清楚一個線程和一個進程之間的區別。非正式定義:線程是作爲進程的一部分執行的一系列代碼;一個進程可能包含許多線程,它們共享相同的進程空間和虛擬內存空間。線程將在完成時結束(並終止它們自己),而不必結束父進程。從聽起來像,你應該使用一個線程同步執行functionA。一個新的過程肯定會佔用更多的資源。 –

回答

2

讓我們清楚一下線程和進程之間的區別。非正式定義:線程是作爲進程的一部分執行的一系列代碼;一個進程可能包含許多線程,它們共享相同的進程空間和虛擬內存空間。線程將在完成時結束(並終止它們自己),而不必結束父進程。從聽起來像,你應該使用一個線程同步執行functionA。一個新的過程肯定會佔用更多的資源,聽起來沒有必要此外,如果您需要在線程完全執行完成後再次執行代碼,則需要再次創建線程。另一方面,如果這種方法看起來適合您正在執行的任務,則可以以無限循環的方式編寫在新線程中執行的代碼。

+1

他可以在'while'循環中執行函數,所以他不必再次創建線程。 –

+0

確實如此,除非它完全執行完畢,否則不需要再次創建線程。但是,這取決於線程的控制流程。 –

+1

@ CaitLan Jenner我想用的東西就像這樣'def Mythread():',然後在'while循環中'我將添加'Mythread.start()'以便它每次創建一個新線程 –

2

CaitLAN的回答留下了幾個重要的細節:

1)進程之間的通信比線程間通信困難。線程都住在同一個地址空間,所以它們之間的通信幾乎和線程A寫入一個變量一樣簡單,而線程B讀取它。

進程通過共享管道,共享文件,網絡連接或操作系統提供的其他方式相互通信。如果你想在進程之間傳遞對象,它取決於你(或者你使用的某個框架)爲「編組」和「反編組」(又名,「序列化」,「酸洗」等)提供方法。對象。

*有一個魔鬼潛伏在那個「差不多」,這比我想在這裏描述的更復雜。谷歌「線程同步」和/或「內存可見性」。

2)你可以安全地殺死一個進程。你永遠無法確定殺死一個線程。如果你的函數A有可能會離開深層,那麼如果它運行在程序中的一個線程中,它可能會取消你的整個程序,但是如果functionA作爲一個單獨的Python進程運行,你的程序可能會恢復*。

*再次,在這個空間寫太多了。

相關問題