在linux系統下,使用os.fork(),
呼叫一次,返回兩次,作業系統自動把當前程序(父程序)複製了乙份(子程序),然後分別在父程序和子程序內返回。子程序永遠返回0,父程序返回子程序的id。經過這樣做,父程序就能fork出很多子程序,並可以記錄下子程序的id號了,子程序可以通過getppid()
來獲取父程序id。fork()
僅在unix/linux下使用,windows則不行。 所以,在python中,存在乙個跨平台的包mutiprocessing
,通過引入包中的process
類,就可以建立多程序程式了,可以建立乙個程序p=process(target=func,args=(*,))
,然後利用p.start()及p.join()
來執行了。以上的join()方法可以等待子程序結束後才往下執行,通常用於程序間同步。 另外,可以用程序池的方式,例如p=pool(n)
,然後
,這裡可以使用n種不同的引數傳入,建立不同的程序。用這種方式時,在呼叫join()方法前,要先呼叫close()方法,使得不能再新增新程序。 mutiprocessing包裡提供了queue、pipe等多種程序間通訊的方法。可以直接引入queue
類,然後例項化乙個物件。則不同的程序可以使用put方法發資訊,同時可以使用get方法取資訊。
多執行緒多個任務可以建立多個程序來完成,同時也可以建立多個執行緒來完成,執行緒是作業系統直接的執行單元。 python含有threading
這個高階模組,要啟動乙個執行緒,就是把乙個函式傳出並建立thread例項,然後呼叫start()方法開始執行,例如t=threading.thread(target=func,name=*)
,注意這裡的name屬性,它是給執行緒命名的,預設值為thread-1···。要注意的是,剛才說了,任何乙個程序都含有乙個執行緒,而這個主線程則執行著我們編寫的程式,可以呼叫threading.current_thread().name
來檢視它,它的名字就叫mainthread。 在多執行緒程式設計中,有乙個最大的問題就在於程序內的資源被各個執行緒所共享,程序內任何變數都可以被任何乙個執行緒修改,因此,執行緒之間若去修改同乙個變數,則可能導致程式bug。所以,引入了鎖機制。 當某個執行緒去修改某個變數時,可以在變數所在的方法內加一把鎖,使得其他執行緒不能同時執行該方法,只有釋放了鎖後,其他執行緒才能去獲得鎖並獲得修改權。建立乙個鎖是通過lock=threading.lock()
來實現的,可以使用try···finally···
語句,在try之前使用lock.acquire()
獲得鎖,然後在try語句裡面修改變數,然後在finally語句裡加lock.release()
來保證鎖一定被釋放,避免成為乙個死鎖。多程序的優點是穩定性好,乙個子程序崩潰了,不會影響主程序以及其餘程序。但是缺點是建立程序的代價非常大,因為作業系統要給每個程序分配固定的資源,並且,作業系統對程序的總數會有一定的限制,若程序過多,作業系統排程都會存在問題,會造成假死狀態。
多執行緒優點是效率較高一些,但是致命的缺點是任何乙個執行緒崩潰都可能造成整個程序的崩潰,因為它們共享了程序的記憶體資源池。 對於任務數來說,無論是多程序或者多執行緒,都不能太多。因為作業系統在切換任務時,會有一系列的保護現場措施,這要花費相當的系統資源,若任務過多,則大部分資源都被用做幹這些了,結果就是所有任務都做不好,所以作業系統會限制程序的數量。 另外,考慮計算密集型及io密集型應用程式。對於計算密集型,多工勢必造成資源浪費。對於io密集型,因為io速度遠低於cpu計算速度,所以使用多工方式可以大大增大程式執行效率。
程序 執行緒 多程序 多執行緒的優缺點
ibm有個傢伙做了個測試,發現切換執行緒context的時候,windows比linux快一倍多。進出最快的鎖 windows2k的 critical section和linux的pthread mutex windows比linux的要快五倍左右。當然這並不是說linux不好,而且在經過實際程式設...
PHP 多程序和多執行緒的優缺點
使用多程序,子程序結束以後,核心會負責 資源 使用多程序,子程序異常退出不會導致整個程序thread退出.父程序還有機會重建流程.乙個常駐主程序,只負責任務分發,邏輯更清楚.多程序方式更加穩定,另外利用程序間通訊 ipc 也可以實現資料共享。共享記憶體,這種方式和執行緒間讀寫變數是一樣的,需要加鎖,...
Linux 多程序與多執行緒的理解及優缺點
首先我們的問題是,執行緒是什麼?執行緒是程序中的一條執行流,是cpu執行排程的基本單位,乙個程序中可以有多個執行緒。在linux下,執行緒執行流是通過pcb實現的,且乙個程序中可能有多個pcb,這些pcb共享同乙個程序中大部分資源,也可以將其稱作輕量級程序。linux下程序是系統進行資源分配的基本單...