成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

python學(xué)習(xí)筆記 - fork, multiprocessing

littleGrow / 1850人閱讀

摘要:近年來,人工智能的興起使得更加火爆了。獲取當(dāng)前進(jìn)程父進(jìn)程的。但是唯一遺憾的是,函數(shù)只能在系統(tǒng)中使用,不能在系統(tǒng)中使用。因此在下,需要將其包含在中。則是立即返回一個(gè)可迭代對象。則是返回可迭代函數(shù)。

Python一直是一門對初學(xué)者非常友好的語言,在數(shù)據(jù)分析、Web 開發(fā)、網(wǎng)絡(luò)安全、網(wǎng)絡(luò)爬蟲等方面應(yīng)用廣泛。近年來,人工智能的興起使得 Python 更加火爆了。

我們在處理大量數(shù)據(jù)或者需要快速爬取多種網(wǎng)絡(luò)資源的時(shí)候,我們無法避免使用到進(jìn)程。Cpython 解釋器中多線程涉及到 GIL 問題,我們這里暫不做考慮。

Python 實(shí)現(xiàn)多進(jìn)程的方式有多種,我們下面一一來學(xué)習(xí)一下吧。

fork

Linux/Unix系統(tǒng)提供了一個(gè)非常特殊的函數(shù)fork().該函數(shù)在調(diào)用之后,調(diào)用它的進(jìn)程會(huì)被復(fù)制一份,包括當(dāng)前的RAM和接下來要執(zhí)行的代碼。
關(guān)于fork的具體內(nèi)容可以閱讀更多的文章:
http://blog.csdn.net/jason314...
http://blog.csdn.net/cywosp/a...

調(diào)用的fork()函數(shù),它在主進(jìn)程中返回的是子進(jìn)程的pid;它在子進(jìn)程中反饋的是0.
那么,我們就可以根據(jù)fork()函數(shù)返回的值來判斷是在主進(jìn)程中還是在子進(jìn)程中了。
在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()

上面的代碼用到了幾個(gè)函數(shù),羅列如下:

os.fork(),創(chuàng)建進(jìn)程,在主進(jìn)程中返回子進(jìn)程的id,在子進(jìn)程中返回0.

os.getpid() 獲取到當(dāng)前進(jìn)程的id。

os.getppid() 獲取當(dāng)前進(jìn)程父進(jìn)程的id。

但是唯一遺憾的是,fork()函數(shù)只能在linuxunix系統(tǒng)中使用,不能在windows系統(tǒng)中使用。

multiprocessing

Python提供了跨平臺(tái)的多進(jìn)程支持,multiprocessing. multiprocessing模塊提供了一個(gè)Process類代表一個(gè)進(jìn)程。我們可以用Process創(chuàng)建一個(gè)進(jìn)程。

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) 構(gòu)造一個(gè)進(jìn)程

process.start() 進(jìn)程開始

process.join() 進(jìn)程同步,Main進(jìn)程序等待子程序完成后在執(zhí)行后代碼。

需要注意的是,在windows下,如果子進(jìn)程序不是在__main__中創(chuàng)建的,那么就會(huì)出錯(cuò)。因?yàn)閣indows在創(chuàng)建子進(jìn)程的時(shí)候,會(huì)將創(chuàng)建它的py文件import進(jìn)去。import進(jìn)去機(jī)會(huì)執(zhí)行,那么就會(huì)不斷地創(chuàng)建子進(jìn)程,所以會(huì)出錯(cuò)。
因此在windows下,需要將其包含在__main__中。

Pool

上面的提到的Process主要用于創(chuàng)建一個(gè)進(jìn)程,如何創(chuàng)建多個(gè)呢?Python在multiprocessing包里為我們提供了Pool類。
我們可以使用Pool.apply_async(func, args)函數(shù)來創(chuàng)建子進(jìn)程。
代碼:

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().即主進(jìn)程會(huì)在.join()處等待worker進(jìn)程們結(jié)束后再執(zhí)行。

apply() 和 apply_async()

apply()apply_async()的區(qū)別就是前者是阻塞式的,后者是非阻塞式的。
阻塞式意思就是需要等待子進(jìn)程完成后才能執(zhí)行主線程后續(xù)的內(nèi)容。
非阻塞意思就是無需等待子進(jìn)程,兩者是同步進(jìn)行的。

map() 和 map_async()

跟高階函數(shù)map()一致,Poolmap()函數(shù)是將一個(gè)可迭代對象的每一個(gè)元素作用域func。
map也分阻塞和非阻塞。

imap() 和 imap_unordered()

imap 與 map的區(qū)別是,map是當(dāng)所有的進(jìn)程都已經(jīng)執(zhí)行完了,并將結(jié)果返回了,那么才返回map()函數(shù)的一個(gè)list結(jié)果。
imap()則是立即返回一個(gè)iterable可迭代對象。其迭代隨著進(jìn)行返回的結(jié)果而逐步迭代。

imap()和 imap_unordered()的區(qū)別

imap_unordered()不保證返回的結(jié)果順序與進(jìn)程添加的順序一致。

怎么取得進(jìn)程的結(jié)果?

阻塞式函數(shù):
Pool.apply()直接返回結(jié)果
Pool.map() 直接返回一個(gè)list
非阻塞式函數(shù)
Pool.apply_async()和Pool.map_async() 返回一個(gè)AsyncResult對象。
AsyncResult對象具有:get()函數(shù)可以獲取結(jié)果。
imap() imap_unordered()則是返回可迭代函數(shù)。

一個(gè)有用的函數(shù) multiprocessing.cpu_count()

multiprocess.cpu_count()可以返回本計(jì)算機(jī)cpu的數(shù)量。
我們在新建一個(gè)進(jìn)程池的時(shí)候,如果不填寫任何參數(shù),那么進(jìn)程池的容量默認(rèn)就是cpu的數(shù)量。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/38360.html

相關(guān)文章

  • python 學(xué)習(xí)筆記 - Queue & Pipes,進(jìn)程間通訊

    摘要:的讀寫效率要高于。進(jìn)程間的基于機(jī)制建立。當(dāng)主進(jìn)程創(chuàng)建子進(jìn)程后,也被拷貝了一份。此后,關(guān)閉主進(jìn)程的一個(gè),關(guān)閉一個(gè)子進(jìn)程的一個(gè)。據(jù)官方文檔也是基于的實(shí)現(xiàn)。 上面寫了Python如何創(chuàng)建多個(gè)進(jìn)程,但是前面文章中創(chuàng)建的進(jìn)程都是啞巴和聾子,自己顧自己執(zhí)行,不會(huì)相互交流。那么如何讓進(jìn)程間相互說說話呢?Python為我們提供了一個(gè)函數(shù)multiprocessing.Pipe和一個(gè)類:multipro...

    xiaodao 評論0 收藏0
  • Python 多進(jìn)程實(shí)踐

    摘要:多進(jìn)程的方式可以增加腳本的并發(fā)處理能力,支持這種多進(jìn)程的編程方式在類系統(tǒng)中,的模塊內(nèi)置了函數(shù)用以創(chuàng)建子進(jìn)程方式創(chuàng)建子進(jìn)程執(zhí)行結(jié)果從結(jié)果可以看到,從開始,下面的部分代碼運(yùn)行了兩次,第一次是父進(jìn)程運(yùn)行,第二次是子進(jìn)程運(yùn)行,且子進(jìn)程的的結(jié)果總是, 多進(jìn)程的方式可以增加腳本的并發(fā)處理能力, python 支持這種多進(jìn)程的編程方式 在類unix系統(tǒng)中, python的os 模塊內(nèi)置了fork 函...

    makeFoxPlay 評論0 收藏0
  • Python學(xué)習(xí)】windows環(huán)境不能用的函數(shù)

    摘要:普通的函數(shù)調(diào)用,調(diào)用一次,返回一次,但是調(diào)用一次,返回兩次,因?yàn)椴僮飨到y(tǒng)自動(dòng)把當(dāng)前進(jìn)程稱為父進(jìn)程復(fù)制了一份稱為子進(jìn)程,然后,分別在父進(jìn)程和子進(jìn)程內(nèi)返回。子進(jìn)程永遠(yuǎn)返回,而父進(jìn)程返回子進(jìn)程的。 一、Before Python學(xué)習(xí)過程中,經(jīng)常發(fā)現(xiàn)教程上講的函數(shù)在本機(jī)上會(huì)報(bào)錯(cuò): AttributeError: module object has no attribute *** 作為一個(gè)初學(xué)...

    googollee 評論0 收藏0
  • threading + multiprocessing + logging = 死鎖 ?

    摘要:后來通過調(diào)查發(fā)現(xiàn)是因?yàn)槌绦蛑型瑫r(shí)使用了多線程,多進(jìn)程以及模塊,導(dǎo)致子進(jìn)程中出現(xiàn)了死鎖的情況。當(dāng)創(chuàng)建子進(jìn)程的時(shí)候,后臺(tái)線程中的模塊正好獲取了一個(gè)鎖在記錄日志信息。 前段時(shí)間有個(gè)程序突然出現(xiàn)了子進(jìn)程不工作的情況。 后來通過調(diào)查發(fā)現(xiàn)是因?yàn)槌绦蛑型瑫r(shí)使用了多線程,多進(jìn)程以及 logging 模塊,導(dǎo)致子進(jìn)程中出現(xiàn)了死鎖的情況。 當(dāng)創(chuàng)建子進(jìn)程的時(shí)候,后臺(tái)線程中的 logging 模塊正好獲取了一...

    netmou 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<