【python】詳解multiprocessing多進程-Lock、Rlock進程同步(四)

       對於多進程multiprocessing和多線程threading這兩個庫的同步,基本上是相似的使用方式。之前寫過threading的Lock、Rlock一文,詳細講解了鎖的同步使用,詳見:【python】詳解threading模塊:lock、Rlock的使用(二)本此總結可以結合該文章,在此基礎上進一步展示實例:

不使用鎖進行同步

import multiprocessing
import time


def job(v, num):
    for _ in range(5):
        time.sleep(0.1)  # 暫停0.1秒,讓輸出效果更明顯
        v.value += num   # v.value獲取共享變量值
        print(v.value, end=",")


def multicore():
    v = multiprocessing.Value('i', 0)  # 定義共享變量
    p1 = multiprocessing.Process(target=job, args=(v, 1))
    p2 = multiprocessing.Process(target=job, args=(v, 3))  # 設定不同的number看如何搶奪內存
    p1.start()
    p2.start()
    p1.join()
    p2.join()


if __name__ == '__main__':
    multicore()

'''
# 進程1和進程2在相互搶着使用共享內存v
1,5,9,13,17,4,8,12,16,20,
'''

使用鎖進行同步

import multiprocessing
import time
# lock = multiprocessing.Lock()
lock = multiprocessing.RLock()
def job(v, num,lock):
    lock.acquire()
    for _ in range(5):
        time.sleep(0.1)  # 暫停0.1秒,讓輸出效果更明顯
        v.value += num  # v.value獲取共享變量值
        print(v.value, end=",")
    lock.release()

def multicore():
    v = multiprocessing.Value('i', 0)  # 定義共享變量
    p1 = multiprocessing.Process(target=job, args=(v, 1, lock))
    p2 = multiprocessing.Process(target=job, args=(v, 3, lock))  # 設定不同的number看如何搶奪內存
    p1.start()
    p2.start()
    p1.join()
    p2.join()

'''
# 顯然,進程鎖保證了進程p1的完整運行,然後才進行了進程p2的運行
1,2,3,4,5,8,11,14,17,20,
'''
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章