0

(請注意,這整個問題,雖然解決parrallel編程,主要是語境下成幀/蟒蛇3.X的應用程序)澄清的並行線程之間的差異/處理

此刻,我收集從閱讀中得知:

a 進程,是一組指令,以及它在運行時伴隨的所有資源。它將包括以下代碼,以及輸入/輸出/資源/內存/文件句柄/等。換句話說,它的整個廚房水槽。

# this script, while running as a whole, is considered a process 

print('hello world') 

with open('something.txt', 'a') as file_handle: 
    for i in range(500): 
     file_handle.write('blablabla') 
print('job done!') 

但是,如果我想要做更多的時間是相同的 - 爲了最大限度地提高我的電腦處理能力 - 我不得不產生更多 進程或線程的選項。與上面簡單的python腳本過程類比相比,我選擇哪一個,它們會是什麼?是否正在產生另一個過程,等同於在更改文件名時再次回顧整個過程?

# changed filename (is this "another process?") 

print('hello world') 

with open('something_else.txt', 'a') as file_handle: 
    for i in range(500): 
     file_handle.write('blablabla') 
print('job done!') 

我也得到了模糊的概念,一個單一的進程可以包含多個線程,將它只是加載大量的更多的「概念性」的循環則相當於?

# like would this be a "thread" a barebones "subset" of an entire program? 

with open('something.txt', 'a') as file_handle: 
    for i in range(500): 
     file_handle.write('blablabla') 

不管怎樣,兩者真的不同嗎?在網上搜索時,我發現流程更獨立和重量級,而線程更輕量化,「更容易與對方共享內存」。但這到底意味着什麼?爲什麼不能進程共享內存?如果線程可以「共享內存」,我怎麼不能訪問來自同一腳本的不同線程的不同變量(例如from thread_a import var_data

最後,究竟計算什麼? CPU是否計算線程或進程?或者它是一個包含多個內核/等的總稱。內核是否計算進程或線程?


摘要:

1)用簡單的Python腳本作爲進程的例子,你會產卵另一個進程/線程相當於是什麼? (例如,重複的腳本/腳本的子集/只有一段代碼)

2)進程與線程有什麼根本的區別,進程是否能夠做一些線程無法做的事情的例子?

3)爲什麼內存/數據通常被描述爲「難以共享」進程比線程?以及線程如何共享數據呢?

4)CPU是否計算線程或進程。做內核計算線程或進程

5)什麼是何時使用什麼

回答

1

要開始回答這個問題的一般準則/例子,你必須明白什麼是python GIL。基本上Python被設計爲讓代碼的任何部分訪問內存。爲了避免問題(例如同時多次調用同一內存......),有一個鎖定禁止同時執行兩個任務。 所以這就是爲什麼python是純粹的程序,一個接一個地執行任務。

在現代編程中,有更好地使用多核處理器的意願,並因此將編程並行化以提高性能。因爲GIL的,有2解決方法:

  • Threading是一個模塊,其允許產生多個任務「同時」在不同的線程。問題在於它並非真正在同一時間,而是被分解爲原子任務,並在不同的任務之間切換。但是你永遠不會同時有兩個任務,所以你仍然可以像往常一樣分享內存,這就是爲什麼它很簡單。

  • multiprocessing另一方面,允許您產生真正的進程,它將同時工作。但價格是你無法安全地在這些進程之間共享內存(以經典的方式)。使用多個線程的多個進程沒有問題。 雖然你並不完全孤單。有幾種方法可以在進程間安全地進行通信,例如使用Lock。你可以看到更多關於這個here

總結一下,線程和進程允許你爲別人分開一些任務,爲你提供一種改進你的基本程序的方法。在某些語言中沒有他們的工作方式太多區別,但在Python要記住的主要事情是:

  • 主題:保持一個共享內存,但沒有真正的並行編程。如果您的代碼是等待時間,那麼這非常有用,因此您可以在其間執行其他操作。如果您使用的是100%的CPU,則會降低您的代碼速度,因爲執行會在任務之間經常更改並導致開銷。

  • 過程:實施起來有點困難,因爲你必須擔心內存,通常你不用Python。主要的好處是如果你的代碼可以並行化,你可以顯着提高你的性能。

+0

我想了解更多關於線程/進程的微妙細微差別以及他們如何共享資源的更詳細的機制。我可以去哪裏學習?這是否屬於OS課程或並行編程的入門領域?任何推薦的材料? (當然重點放在python上) 另外,如果我有2個內核,不會有2個線程實際並行嗎? – AlanSTACK

+0

Python中的線程實際上並不平行,即使你有多個核心。我認爲你應該參加並行編程課程而不是OS課程。線程和進程都不是很難開始,然後它都依賴於你的應用程序。你可以在這裏找到很多文檔(http://sebastianraschka.com/Articles/2014_multiprocessing_intro.html),[這裏](https://pymotw.com/2/multiprocessing/communication.html),[這裏]( http://eli.thegreenplace.net/2012/01/04/shared-counter-with-pythons-multiprocessing)。 – CoMartel

+0

您應該真正定義一個簡單的應用程序並使用線程和進程對其進行測試。如果您對特定應用程序有疑問並且哪種方法最適合,請詢問關於此特定情況的另一個問題。 – CoMartel