一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python多進程同步Lock、Semaphore、Event實例

Python多進程同步Lock、Semaphore、Event實例

2020-05-14 09:34腳本之家 Python

這篇文章主要介紹了Python多進程同步Lock、Semaphore、Event實例,Lock用來避免訪問沖突、Semaphore用來控制對共享資源的訪問數量、Event用來實現進程間同步通信,需要的朋友可以參考下

同步的方法基本與多線程相同。

1) Lock

當多個進程需要訪問共享資源的時候,Lock可以用來避免訪問的沖突。

復制代碼 代碼如下:


import multiprocessing
import sys

 

def worker_with(lock, f):
    with lock:
        fs = open(f,"a+")
        fs.write('Lock acquired via with\n')
        fs.close()
       
def worker_no_with(lock, f):
    lock.acquire()
    try:
        fs = open(f,"a+")
        fs.write('Lock acquired directly\n')
        fs.close()
    finally:
        lock.release()

if __name__ == "__main__":

    f = "file.txt"
 
    lock = multiprocessing.Lock()
    w = multiprocessing.Process(target=worker_with, args=(lock, f))
    nw = multiprocessing.Process(target=worker_no_with, args=(lock, f))

    w.start()
    nw.start()

    w.join()
    nw.join()

 

在上面的例子中,如果兩個進程沒有使用lock來同步,則他們對同一個文件的寫操作可能會出現混亂。

2)Semaphore

Semaphore用來控制對共享資源的訪問數量,例如池的最大連接數。

 

復制代碼 代碼如下:


import multiprocessing
import time

 

def worker(s,i):
    s.acquire()
    print(multiprocessing.current_process().name + " acquire")
    time.sleep(i)
    print(multiprocessing.current_process().name + " release")
    s.release()

if __name__ == "__main__":
 
    s = multiprocessing.Semaphore(2)
    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(s,i*2))
        p.start()

 

上面的實例中使用semaphore限制了最多有2個進程同時執行。

3)Event

Event用來實現進程間同步通信。

 

復制代碼 代碼如下:


import multiprocessing
import time

 

def wait_for_event(e):
    """Wait for the event to be set before doing anything"""
    print ('wait_for_event: starting')
    e.wait()
    print ('wait_for_event: e.is_set()->' + str(e.is_set()))

def wait_for_event_timeout(e, t):
    """Wait t seconds and then timeout"""
    print ('wait_for_event_timeout: starting')
    e.wait(t)
    print ('wait_for_event_timeout: e.is_set()->' + str(e.is_set()))


if __name__ == '__main__':
    e = multiprocessing.Event()
    w1 = multiprocessing.Process(name='block',
                                 target=wait_for_event,
                                 args=(e,))
    w1.start()

    w2 = multiprocessing.Process(name='non-block',
                                 target=wait_for_event_timeout,
                                 args=(e, 2))
    w2.start()

    time.sleep(3)
    e.set()
    print ('main: event is set')
   
#the output is:
#wait_for_event_timeout: starting
#wait_for_event: starting
#wait_for_event_timeout: e.is_set()->False
#main: event is set
#wait_for_event: e.is_set()->True

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美在线播放一区二区 | 欧美一区二区日韩一区二区 | 白丝女仆被啪到深夜漫画 | xx顶级欧美熟妞xxhd | 天美网站传媒入口网址 | 撕开老师的丝袜白丝扒开粉嫩的小 | aⅴ导航站 | 9色视频在线观看 | www.国产一区二区三区 | 免费刷10000名片赞网站 | www黄| 欧美一卡二卡科技有限公司 | 青青色在线 | 调教女警花穿环上班 | 精品午夜久久网成年网 | 俄罗斯bbbbbbxxxxxx| 日本人在线看片 | oneday日本在线观看完整版 | 传说之下羊妈挤羊奶网站 | 亚州人成网在线播放 | 狠狠五月天中文字幕 | 俄罗斯美女尿尿 | 手机av | 国产在线激情视频 | 四神集团1涨奶是第几章 | 色婷婷综合久久久中文字幕 | 久久精品成人免费网站 | 大桥未久aⅴ一区二区 | 俄罗斯一级大片 | 四虎2023| 午夜深情在线观看免费 | 欧美大片一区二区三区 | 成人影院在线观看 | 亚洲区在线播放 | 射逼网站 | 激情亚洲 | 精品国产一区二区在线观看 | 国产精品aⅴ | 亚洲国产精品久久网午夜小说 | 99福利视频导航 | 国产香蕉97碰碰在线视频 |