[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个进程开始了 """
写满200篇博文再说