Python多進程fork()函數(shù)詳解
進程
進程是程序的一次動態(tài)執(zhí)行過程,它對應了從代碼加載、執(zhí)行到執(zhí)行完畢的一個完整過程。進程是系統(tǒng)進行資源分配和調(diào)度的一個獨立單位。進程是由代碼(堆棧段)、數(shù)據(jù)(數(shù)據(jù)段)、內(nèi)核狀態(tài)和一組寄存器組成。
在多任務操作系統(tǒng)中,通過運行多個進程來并發(fā)地執(zhí)行多個任務。由于每個線程都是一個能獨立執(zhí)行自身指令的不同控制流,因此一個包含多個線程的進程也能夠實現(xiàn)進程內(nèi)多任務的并發(fā)執(zhí)行。
進程是一個內(nèi)核級的實體,進程結構的所有成分都在內(nèi)核空間中,一個用戶程序不能直接訪問這些數(shù)據(jù)。
進程的狀態(tài):
創(chuàng)建、準備、運行、阻塞、結束。
進程間的通信方式可以有:
- 文件
- 管道
- socket
- 信號
- 信號量
- 共享內(nèi)存
要讓Python程序實現(xiàn)多進程(multiprocessing),必須先了解操作系統(tǒng)的相關知識。
在Unix/Linux操作系統(tǒng)提供了一個fork()函數(shù),它非常特殊,調(diào)用一次,返回兩次,因為操作系統(tǒng)將當前的進程(父進程)復制了一份(子進程),然后分別在父進程和子進程內(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模塊,下面是一個關于進程的例子:
import os print 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í)行結果:
1526
I (1526) just created a child process (1527).
I am child process (1527) and my parent is 1526.
有了fork調(diào)用,一個進程在接到新的任務時,就可以復制出一個子進程來處理新任務。常見的Apache服務器就是由父進程監(jiān)聽端口,一旦有新的http請求時,就fork出子進程來處理新的http請求。
再看一個例子:
#coding=utf-8 import os os.fork() print 1
執(zhí)行結果:
1
1
程序中,父進程中創(chuàng)建了一個子進程,子進程運行打印了一個1,回到父進程又打印了一個1,所以結果是打印了2個1。
需要注意的是,上面創(chuàng)建進程的函數(shù)都是Unix/Linux下的,Windows下是沒有的,那在Windows下又使用什么實現(xiàn)多進程呢?
由于Python是跨平臺的,自然也應該提供一個跨平臺的多進程支持。multiprocessing模塊就是跨平臺版本的多進程模塊, 支持子進程、通信和共享數(shù)據(jù)、執(zhí)行不同形式的同步。
multiprocessing模塊提供了一個Process類來創(chuàng)建一個新的進程對象。
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內(nèi)容請查看下面相關鏈接