python-創建進程的三種方式


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()進行等待),任務都是交給子進程執行的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM