對於多進程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,
'''