進程
進程是程序的一次動態(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 multiprocessingfork()函數(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)多進程呢?
新聞熱點
疑難解答