進程鎖
進程與進程之間是獨立的,爲何需要鎖?
對於進程,屏幕的輸出只有一個,此時就涉及到資源的競爭。在Linux的Python2.x中可能出現問題。
這僅僅是一種情況,多個進程之間雖然是獨立的,但僅限於內存和運算,如果涉及到其它一些資源,
就可能存在競爭問題,在實際使用過程中要注意思考和防範錯誤。
from multiprocessing import Process, Lock def func(lock, i): lock.acquire() print("hello,", i) lock.release() if __name__ == "__main__": lock = Lock() for number in range(10): Process(target=func, args=(lock, number)).start()
進程池
進程的啓動,是克隆的過程,某些情況下可能開銷過大,所以需要引用“進程池”。
from multiprocessing import Process, Pool import os, time def foo(i): time.sleep(2) print("in foo", os.getpid()) return i + 100 if __name__ == "__main__": pool = Pool(5) # 允許進程池裏同時放入5個進程 for i in range(10): # pool.apply(func=foo, args=(i,)) # 同步執行,或者叫串行執行 pool.apply_async(func=foo, args=(i,)) # 異步執行 print('main end') pool.close() pool.join() # 注意,這裏要先close,然後再調用join,否則異步執行的線程池不會執行
注意,程序的執行結果是先打印main end,然後再打印新進程的顯示。
from multiprocessing import Process, Pool import os, time def foo(i): time.sleep(2) print("in foo", os.getpid()) return i + 1000 def bar(args): print("processes finished", args) if __name__ == "__main__": pool = Pool(5) # 允許進程池裏同時放入5個進程 for i in range(10): pool.apply_async(func=foo, args=(i,), callback=bar) # 帶回調的進程 print('main end') pool.close() pool.join() # 注意,這裏要先close,然後再調用join,否則異步執行的線程池不會執行 # 帶callback的例子:主進程一直鏈接數據庫,子進程執行完之後,通過回調寫入數據庫,不用再次鏈接 # 數據庫,提高了效率,減少了資源浪費。 # 需要注意的是回調函數是主進程調用的,而且參數是進程函數的返回值。