python multiprocessing使用容易遇到的坑記錄隨筆
阿新 • • 發佈:2022-11-30
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為什麼會讓前者順利執行,而不是選擇報語法錯誤。