###############    多进程的信号量    ##############

# 多进程的信号量

from multiprocessing import Process
import time,random
from multiprocessing import Semaphore
# ktv只有1个房间,1个房间只能装4个人,但是这样写就是20个人都进入到房间了,
# 假设ket门口有4把钥匙,一个进程来了那一把钥匙,然后关门,这样只有4个进程能拿到,剩下的之后1个进程出来了才可以继续其他的进程,
# 这个概念就叫做信号量,同一时间就只有四个人,
def ktv(i,sem):
sem.acquire() # 获取钥匙
print("%d进入ktv"%i)
time.sleep(random.randint(60,180)) # 这是每一个人唱歌1-3分钟
print("%d走出ktv"%i)
sem.release() # 还钥匙 if __name__ == "__main__":
sem = Semaphore(4) # 这就是设置有多少把钥匙, 信号量的英文就是:Semaphore
for i in range(20):
p=Process(target=ktv,args=(i,sem))
p.start()

###############    进程的事件    ##############

# 进程的事件

# 事件
import time
from multiprocessing import Event, Process # 一个信号,可以使所有的进程都进入阻塞状态,也可以控制所有信号都解除阻塞,
# 一个事件创建之后,默认是阻塞状态,
# e = Event() # 创建一个事件
# print(e.is_set()) # 查看一个事件是否是阻塞状态,
# print(123445)
# e.set() # 这是把阻塞的状态改为true,
# print(e.is_set())
# e.wait() # 根据e.is_set()的结果,如果是false,就会阻塞,如果是true就会不阻塞
# print(12344)
# e.clear() # 这是把阻塞的状态改为false
# print(e.is_set())
# e.wait() # 虽然阻塞了,但是一定要有这个wait,才会阻塞后面的代码,
# print(444444) # 举一个例子,红绿灯 # 每一个进程表示一辆车,
def car(e,i):
#e.is_set() 默认返回False 代表的是绿灯
if not e.is_set():
print("car%s在等待"%i)
e.wait()
print("car%s通行了"%i) def light(e):
while True:
if e.is_set():
e.clear()
print('\033[31m红灯亮了\033[0m')
else:
e.set()
print('\033[32m绿灯亮了\033[0m')
time.sleep(2) if __name__ == '__main__':
e=Event()
# 模拟启动交通灯
p1=Process(target=light,args=(e,))
p1.daemon=True
p1.start()
#模拟20辆小车
for i in range(20):
import random
time.sleep(random.uniform(0,2))
p2=Process(target=car,args=(e,i))
p2.start()
print("程序彻底结束!")

最新文章

  1. Spring, MyBatis 多数据源的配置和管理
  2. ASP.NET MVC 和 Ruby 相结合的Web框架Oak
  3. synchronized在jvm底层是如何实现的
  4. java基础-008
  5. GLES & Shader Language 易错集锦
  6. LN : leetcode 292 Nim Game
  7. Lua 第一个应用程序 Hello World
  8. nginx中时间的管理
  9. 深入理解Scala的隐式转换系统
  10. iOS7 CookBook精彩瞬间(一)property、selector细节、__unused
  11. C# — 创建Windows服务进阶版
  12. vector容器用法详解
  13. JS或AS中处理ARGB、RGBA颜色值时要小心
  14. 一、JDBC的概述 二、通过JDBC实现对数据的CRUD操作 三、封装JDBC访问数据的工具类 四、通过JDBC实现登陆和注册 五、防止SQL注入
  15. 编程精粹--编写高质量C语言代码(1):假想编译程序
  16. linux IPC机制学习博客
  17. 老版本ubuntu更新源地址以及sources.list的配置方法 转
  18. 在kubernetes运行一个容器案例
  19. Softmax回归推导过程
  20. 优秀的WEB前端开发框架:Bootstrap!

热门文章

  1. robotframework+selenium2Library怎样不用手动关掉代理
  2. Web基础之Redis
  3. POJ - 1753 Flip Game (IDA*)
  4. 现在购买5G“商用手机”值不值呢?是花冤枉钱还是提前享受?
  5. 欧拉回路--P2731 骑马修栅栏 Riding the Fences
  6. 第二阶段scrum-2
  7. 留学生如何在Presentation中拿高分?
  8. maven学习(三)-使用maven来创建项目
  9. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring DI(依赖注入)的实现方式属性注入和构造注入
  10. 2020PHP面试-SQL篇