国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python多進程fork()函數(shù)詳解

2020-02-16 01:17:48
字體:
供稿:網(wǎng)友

進程

進程是程序的一次動態(tài)執(zhí)行過程,它對應(yīng)了從代碼加載、執(zhí)行到執(zhí)行完畢的一個完整過程。進程是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位。進程是由代碼(堆棧段)、數(shù)據(jù)(數(shù)據(jù)段)、內(nèi)核狀態(tài)和一組寄存器組成。

在多任務(wù)操作系統(tǒng)中,通過運行多個進程來并發(fā)地執(zhí)行多個任務(wù)。由于每個線程都是一個能獨立執(zhí)行自身指令的不同控制流,因此一個包含多個線程的進程也能夠?qū)崿F(xiàn)進程內(nèi)多任務(wù)的并發(fā)執(zhí)行。

進程是一個內(nèi)核級的實體,進程結(jié)構(gòu)的所有成分都在內(nèi)核空間中,一個用戶程序不能直接訪問這些數(shù)據(jù)。

進程的狀態(tài):

創(chuàng)建、準(zhǔn)備、運行、阻塞、結(jié)束。

進程間的通信方式可以有:

文件 管道 socket 信號 信號量 共享內(nèi)存

要讓Python程序?qū)崿F(xiàn)多進程(multiprocessing),必須先了解操作系統(tǒng)的相關(guān)知識。

在Unix/Linux操作系統(tǒng)提供了一個fork()函數(shù),它非常特殊,調(diào)用一次,返回兩次,因為操作系統(tǒng)將當(dāng)前的進程(父進程)復(fù)制了一份(子進程),然后分別在父進程和子進程內(nèi)返回。

Python中的進程

os.fork() subprocess processing multiprocessing

fork()函數(shù)

函數(shù)原型:

Help on built-in function fork in module posix:fork(...)  fork() -> pid  Fork a child process.  Return 0 to child process and PID of child to parent process.

從fork()函數(shù)原型來看,它也屬于一個內(nèi)建函數(shù)。

子進程永遠返回0,而父進程返回子進程的ID。這樣做的理由是,一個父進程可以fork()出很多子進程,所以,父進程要記下每個子進程的ID,而子進程只需要調(diào)用getppid()就可以拿到父進程的ID。

Python的進程函數(shù)fork()是在os模塊,下面是一個關(guān)于進程的例子:

import osprint os.getpid() #獲取子進程的進程號pid = os.fork()if pid == 0 : print 'I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid())else : print 'I (%s) just created a child process (%s).' % (os.getpid(), pid)

執(zhí)行結(jié)果:

1526
I (1526) just created a child process (1527).
I am child process (1527) and my parent is 1526.

有了fork調(diào)用,一個進程在接到新的任務(wù)時,就可以復(fù)制出一個子進程來處理新任務(wù)。常見的Apache服務(wù)器就是由父進程監(jiān)聽端口,一旦有新的http請求時,就fork出子進程來處理新的http請求。

再看一個例子:

#coding=utf-8import osos.fork()print 1

執(zhí)行結(jié)果:

1
1

程序中,父進程中創(chuàng)建了一個子進程,子進程運行打印了一個1,回到父進程又打印了一個1,所以結(jié)果是打印了2個1。

需要注意的是,上面創(chuàng)建進程的函數(shù)都是Unix/Linux下的,Windows下是沒有的,那在Windows下又使用什么實現(xiàn)多進程呢?

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 营口市| 旬阳县| 全椒县| 灵川县| 庄河市| 淳化县| 通道| 鄂托克前旗| 兴文县| 姜堰市| 通化县| 安塞县| 昆山市| 峨山| 开封市| 青州市| 宣汉县| 阿克陶县| 佛冈县| 内黄县| 平昌县| 新和县| 信阳市| 遂溪县| 西林县| 会泽县| 台山市| 太湖县| 白沙| 泽州县| 鲜城| 沅江市| 兴和县| 屯昌县| 阳高县| 水富县| 岐山县| 马尔康县| 佛学| 丁青县| 宁南县|