zoukankan      html  css  js  c++  java
  • 多进程+信号量Semaphore

    通过下面一个例子进行理解。

    from multiprocessing import Process
    from multiprocessing import Semaphore
    import datetime
    import time
    import multiprocessing
    
    def worker(s, i):
        s.acquire()
        print(multiprocessing.current_process().name + " acquire",datetime.datetime.now())
        time.sleep(i)
        print(multiprocessing.current_process().name + " release",datetime.datetime.now(),"
    ")
        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()

    运行结果:

    分析:
    p = multiprocessing.Process(……)定义了五个进程,p.start五个进程并行,造成如图的结果是信号量限制进程对临界资源的访问的原因。
    s = multiprocessing.Semaphore(2)定义了信号量最大为2,release: +1 acquire: -1
    22:41:30
    第一步,五个进程并发执行,进程1执行并等待0s,S-1=1
    第二步,五个进程并发执行,进程2执行并等待2s,S-1=0
    第三步,因为进程1执行了,并且等待时间为0,而进程2需要等待2s。所以这步必定是进程1执行,并且进程1执行完毕,而信号量+1且进入非堵塞。
    第四步,进程2进入等待2s,所以只剩下三个进程3、4、5并行,进程4执行并等待6s,S-1=0
    22:41:32
    第五步,进程2等待2s完毕,进程2执行,S+1=1
    第六步,进程4等待中,只剩下两个进程3、5并行,进程3执行并等待4s,S-1=0
    22:41:36
    第七步,进程3和4等待时间同时结束,进程3争夺并临界资源执行,S+1=1
    第八步,进程4等待,进程5执行并等待8s,S-1=0
    第九步,进程4执行,S+1=1
    22:41:44
    第十步,进程5执行,S+1=1
     
     
     
    参考:http://www.cnblogs.com/kaituorensheng/p/4445418.html
  • 相关阅读:
    (原).NET程序加入多语言包解决方案工具,超级棒
    c++标准库中的四个智能指针比较
    Mongodb c++ API的测试和封装
    MongoDB的c++驱动安装痛苦历程
    GLC_Player DOWNLOAD
    MongoDB的连接、创库、删库、插入文档、更新文档
    非关系型数据库--MongoDB的安装及概念
    虚拟机的安装
    OpenGL ES 学习
    QT学习
  • 原文地址:https://www.cnblogs.com/kaiho/p/7868838.html
Copyright © 2011-2022 走看看