1. 程式人生 > 其它 >python multiprocessing使用容易遇到的坑記錄隨筆

python multiprocessing使用容易遇到的坑記錄隨筆

python因為有GIL(Global Interpreter Lock)鎖的問題,所以在計算密集型程式中,推薦使用multiprocessing多程序程式設計。

在使用multiprocessing建立子程序時,很容易遇到一個不易發現的坑,這裡記錄一下。


import multiprocessing
import time
import threading
import os


def fun():

print("in new process, pid = {}, ppid={}".format(os.getpid(), os.getppid()))
print("in new thread, id = %s" % threading.current_thread().ident)

time.sleep(3)
print("process {} finish.".format(os.getpid()))


def main():
print("main pid = {}, ppid={}".format(os.getpid(), os.getppid()))
p = multiprocessing.Process(target=fun)
print("-----1")
p.start()
print("-----2")
p.join()
print("-----3")


if __name__ == '__main__':
main()
 

執行結果顯示如下:

1 main pid = 114664, ppid=111764
2 in new process, pid = 114664, ppid=111764
3 in new thread, id = 106604
4 process 114664 finish.
5 -----1
6 -----2
7 -----3

發現,建立子程序並沒有成功。fun()函式是序列的在主程序中執行的。

原因就出在fun後面的()號上。正確的使用方法,fun後面不能新增括號。

p = multiprocessing.Process(target=fun)

修改之後,程式執行結果如下:

main pid = 119200, ppid=109900
-----1
-----2
in new process, pid = 118472, ppid=119200
in new thread, id = 119512
process 118472 finish.
-----3

從結果可以看出,子程序建立成功,子程序和主程序並行執行。主程序等待子程序退出後再退出。

這個確實是一個容易被忽略的坑,不明白python為什麼會讓前者順利執行,而不是選擇報語法錯誤。