1,os.fork() 方法
import os
ret = os.fork()
if ret == 0:
#子進程
print("Sub process pid = %d, Sub process ppid = %d" % (os.getpid(), os.getppid()))
else:
#父進程
print("Parent Process ret = %d" % ret)
print("Parent Process pid = %d" % os.getpid())
在該方法中,執行os.fork()會再創建一個進程,原進程(父進程)返回一個大於零的值(即ret > 0),這個值恰好是子進程的pid;而創建的新進程會返回零(即ret = 0)。
fork炸彈:在用戶輸入欄輸入:
while True:
os.fork()
設備內存就會很快被塞滿,然后down掉。
2,Process方法
from multiprocessing import Process
def func():
print("i am subprocess")
new_process = Process(tartget=func)
print("i am Parent Process")
Process方法需要指定一個函數,且父進程會等待子進程結束。另外可以新建一個example類繼承Process類,然后重寫__init__和run()函數,之后調用example.start(),它就會自動執行run()函數。
3,Pool方法
from multiprocessing import Pool
import time
def worker(x):
for j in range(1, 11):
print("%d:%d" % (x, j))
time.sleep(1)
pool = Pool(3) # run 3 process simultaneously
for i in range(1, 11):
print(i)
pool.apply_async(worker, (i,))
print("---start---")
pool.close() # 關閉進程池,不允許繼續添加進程
pool.join() # 等待進程池中的所有進程結束
print("---end---")
Pool方法即進程池,需要說明有幾個進程同時運行。在使用apply_async方法時第一個參數是函數名,第二個參數需要輸入一個元組。在示例代碼中,進程池同時允許三個進程運行,另外七個進程排隊等候,當第一批的三個進程執行完后,第二批的三個再執行。所以進程池相當於起到了緩沖的作用。
實際上,在進程池的方式中,父進程基本上只需要等待子進程執行(使用pool.join()進行等待),任務都是交給子進程執行的。