Python進程鎖和進程池

進程鎖

進程與進程之間是獨立的,爲何需要鎖?

對於進程,屏幕的輸出只有一個,此時就涉及到資源的競爭。在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的例子:主進程一直鏈接數據庫,子進程執行完之後,通過回調寫入數據庫,不用再次鏈接
# 數據庫,提高了效率,減少了資源浪費。
# 需要注意的是回調函數是主進程調用的,而且參數是進程函數的返回值。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章