[b0040] python 归纳 (二五)_多进程数据共享和同步_信号量Semaphore

# -*- coding: utf-8 -*-
"""
多进程同步  使用信号量  multiprocessing.Semaphore

逻辑:
    启动5个进程,打印,每个各自睡眠2秒
    竞争2个锁大小的信号量,任何时候只有2个进程在执行打印

总结:
    1、通过信号 实现了Pool的效果,任何时候最多只有2个进程在执行指定代码段
    2、相当于创建了锁的数组,一次创建多把锁,绑定同一个名字
    3、与RLock 有细微区别
      RLock  同一个进程可以锁多次
      Semaphore 多个不同进程可以同时各种获取锁

使用:
    1、创建信号量  s = multiprocessing.Semaphore(2)  锁的个数
    2、当做参数传给子进程
    3、s.acquire() 锁定代码  a.release()

参考:
    get_value() 返回信号量中还剩下多少把空闲锁
"""
import multiprocessing
import time

# 子进程代码
def worker(s):
    s.acquire() # 竞争锁
    print(time.strftime('%M:%S', time.localtime(time.time())), multiprocessing.current_process().name + "acquire");

    time.sleep(2)

    print(time.strftime('%M:%S', time.localtime(time.time())), multiprocessing.current_process().name + "release");
    s.release() # 释放锁


if __name__ == "__main__":
    # 创建有2个锁的信号量
    s = multiprocessing.Semaphore(2)

    # 启动5个进程,实际进程1不一定比进程2先执行
    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(s,))
        p.start()

    time.sleep(15)

"""
Out:

('08:47', 'Process-2acquire')
('08:47', 'Process-4acquire')
('08:49', 'Process-2release')
('08:49', 'Process-3acquire')
('08:49', 'Process-4release')
('08:49', 'Process-1acquire')
('08:51', 'Process-3release')
('08:51', 'Process-5acquire')
('08:51', 'Process-1release')
('08:53', 'Process-5release')

解读:

47秒  有2个进程同时 执行
49秒  旧的2个进程完毕,新的2个进程开始了
"""

 

posted @ 2018-09-12 22:23  sunzebo  阅读(235)  评论(0编辑  收藏  举报