摘要:近年來,人工智能的興起使得更加火爆了。獲取當前進程父進程的。但是唯一遺憾的是,函數只能在系統中使用,不能在系統中使用。因此在下,需要將其包含在中。則是立即返回一個可迭代對象。則是返回可迭代函數。
Python一直是一門對初學者非常友好的語言,在數據分析、Web 開發、網絡安全、網絡爬蟲等方面應用廣泛。近年來,人工智能的興起使得 Python 更加火爆了。
我們在處理大量數據或者需要快速爬取多種網絡資源的時候,我們無法避免使用到進程。Cpython 解釋器中多線程涉及到 GIL 問題,我們這里暫不做考慮。
Python 實現多進程的方式有多種,我們下面一一來學習一下吧。
forkLinux/Unix系統提供了一個非常特殊的函數fork().該函數在調用之后,調用它的進程會被復制一份,包括當前的RAM和接下來要執行的代碼。
關于fork的具體內容可以閱讀更多的文章:
http://blog.csdn.net/jason314...
http://blog.csdn.net/cywosp/a...
調用的fork()函數,它在主進程中返回的是子進程的pid;它在子進程中反饋的是0.
那么,我們就可以根據fork()函數返回的值來判斷是在主進程中還是在子進程中了。
在Python中,為我們提供了os.fork()。
import os print "Process (%s) is running" % os.getpid() i = 100 pid = os.fork() if pid == 0: print "Son process (%s) is running" % os.getpid() else: print "Main process (%s) is running" % os.getpid()
上面的代碼用到了幾個函數,羅列如下:
os.fork(),創建進程,在主進程中返回子進程的id,在子進程中返回0.
os.getpid() 獲取到當前進程的id。
os.getppid() 獲取當前進程父進程的id。
但是唯一遺憾的是,fork()函數只能在linuxunix系統中使用,不能在windows系統中使用。
multiprocessingPython提供了跨平臺的多進程支持,multiprocessing. multiprocessing模塊提供了一個Process類代表一個進程。我們可以用Process創建一個進程。
from multiprocessing import Process import time def son_process(name): time.sleep(2) print "Process %s is running" % name if __name__ == "__main__": son_process = Process(target=son_process, args=("Son",)) print "Son process is started" son_process.start() son_process.join() print "Son process is ended - Printed by Main Process"
上面主要用到了
Process(target, attrs) 構造一個進程
process.start() 進程開始
process.join() 進程同步,Main進程序等待子程序完成后在執行后代碼。
需要注意的是,在windows下,如果子進程序不是在__main__中創建的,那么就會出錯。因為windows在創建子進程的時候,會將創建它的py文件import進去。import進去機會執行,那么就會不斷地創建子進程,所以會出錯。
因此在windows下,需要將其包含在__main__中。
上面的提到的Process主要用于創建一個進程,如何創建多個呢?Python在multiprocessing包里為我們提供了Pool類。
我們可以使用Pool.apply_async(func, args)函數來創建子進程。
代碼:
from multiprocessing import Pool import time def son_process(name): time.sleep(5) print "Process %s is running " % name pool = Pool(4) print "Son process is started" for x in range(0, 10): pool.apply_async(son_process, args=("son_%d"%x,)) pool.close() print "Mark" pool.join() print "Son process is ended - Printed by Main Process"
Pool(4)
join()
Wait for the worker processes to exit. One must call close() or terminate() before using join().即主進程會在.join()處等待worker進程們結束后再執行。
apply() 和 apply_async()apply()和apply_async()的區別就是前者是阻塞式的,后者是非阻塞式的。
阻塞式意思就是需要等待子進程完成后才能執行主線程后續的內容。
非阻塞意思就是無需等待子進程,兩者是同步進行的。
跟高階函數map()一致,Pool的map()函數是將一個可迭代對象的每一個元素作用域func。
map也分阻塞和非阻塞。
imap 與 map的區別是,map是當所有的進程都已經執行完了,并將結果返回了,那么才返回map()函數的一個list結果。
imap()則是立即返回一個iterable可迭代對象。其迭代隨著進行返回的結果而逐步迭代。
imap_unordered()不保證返回的結果順序與進程添加的順序一致。
怎么取得進程的結果?阻塞式函數:
Pool.apply()直接返回結果
Pool.map() 直接返回一個list
非阻塞式函數
Pool.apply_async()和Pool.map_async() 返回一個AsyncResult對象。
AsyncResult對象具有:get()函數可以獲取結果。
imap() imap_unordered()則是返回可迭代函數。
multiprocess.cpu_count()可以返回本計算機cpu的數量。
我們在新建一個進程池的時候,如果不填寫任何參數,那么進程池的容量默認就是cpu的數量。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38360.html
摘要:的讀寫效率要高于。進程間的基于機制建立。當主進程創建子進程后,也被拷貝了一份。此后,關閉主進程的一個,關閉一個子進程的一個。據官方文檔也是基于的實現。 上面寫了Python如何創建多個進程,但是前面文章中創建的進程都是啞巴和聾子,自己顧自己執行,不會相互交流。那么如何讓進程間相互說說話呢?Python為我們提供了一個函數multiprocessing.Pipe和一個類:multipro...
摘要:多進程的方式可以增加腳本的并發處理能力,支持這種多進程的編程方式在類系統中,的模塊內置了函數用以創建子進程方式創建子進程執行結果從結果可以看到,從開始,下面的部分代碼運行了兩次,第一次是父進程運行,第二次是子進程運行,且子進程的的結果總是, 多進程的方式可以增加腳本的并發處理能力, python 支持這種多進程的編程方式 在類unix系統中, python的os 模塊內置了fork 函...
摘要:普通的函數調用,調用一次,返回一次,但是調用一次,返回兩次,因為操作系統自動把當前進程稱為父進程復制了一份稱為子進程,然后,分別在父進程和子進程內返回。子進程永遠返回,而父進程返回子進程的。 一、Before Python學習過程中,經常發現教程上講的函數在本機上會報錯: AttributeError: module object has no attribute *** 作為一個初學...
摘要:后來通過調查發現是因為程序中同時使用了多線程,多進程以及模塊,導致子進程中出現了死鎖的情況。當創建子進程的時候,后臺線程中的模塊正好獲取了一個鎖在記錄日志信息。 前段時間有個程序突然出現了子進程不工作的情況。 后來通過調查發現是因為程序中同時使用了多線程,多進程以及 logging 模塊,導致子進程中出現了死鎖的情況。 當創建子進程的時候,后臺線程中的 logging 模塊正好獲取了一...
閱讀 1403·2021-10-11 10:59
閱讀 3104·2019-08-30 15:54
閱讀 2724·2019-08-30 13:19
閱讀 2456·2019-08-30 13:02
閱讀 2372·2019-08-30 10:57
閱讀 3347·2019-08-29 15:40
閱讀 981·2019-08-29 15:39
閱讀 2300·2019-08-29 12:40