【一】信号量(了解)
- 信号量Semahpore(同线程一样)
【1】引入
- 互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据
- 比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去
- 如果指定信号量为3,那么来一个人获得一把锁,计数加1,当计数等于3时,后面的人均需要等待。
- 一旦释放,就有人可以获得一把锁
信号量与进程池的概念很像,但是要区分开,信号量涉及到加锁的概念
from multiprocessing import Process, Semaphore
import time
import random
def go_wc(sem, user):
# 【1】对信号量加锁,一个进程占用则锁池 -1
sem.acquire()
print(f' {user} 占到一个茅坑')
# 模拟每个人拉屎速度不一样,0代表有的人蹲下就起来了
time.sleep(random.randint(0, 3))
# 【2】释放信号量锁
sem.release()
if __name__ == '__main__':
# 【一】创建一个信号量的池子
sem = Semaphore(5)
# 用来存储所有的子进程
p_l = []
# 【二】十三个子进程
for i in range(13):
# 【三】创建子进程
p = Process(target=go_wc, args=(sem, f'user {i}:>>>> ',))
# 【四】启动子进程
p.start()
# 【五】添加到进程列表
p_l.append(p)
# 等待所有子进程执行完毕
for i in p_l:
i.join()
print('============》')
# user 9:>>>> 占到一个茅坑
# user 8:>>>> 占到一个茅坑
# user 10:>>>> 占到一个茅坑
# user 0:>>>> 占到一个茅坑
# user 7:>>>> 占到一个茅坑
# user 6:>>>> 占到一个茅坑
# user 2:>>>> 占到一个茅坑
# user 11:>>>> 占到一个茅坑
# user 4:>>>> 占到一个茅坑
# user 1:>>>> 占到一个茅坑
# user 5:>>>> 占到一个茅坑
# user 3:>>>> 占到一个茅坑
# user 12:>>>> 占到一个茅坑
# ============》
【二】事件(了解)
【1】什么是事件
- Event(同线程一样)
【2】事件处理方法
-
python线程的事件用于主线程控制其他线程的执行,事件主要提供了三个方法 set、wait、clear。
-
事件处理的机制:
- 全局定义了一个“Flag”
- 如果“Flag”值为 False,那么当程序执行 event.wait 方法时就会阻塞
- 如果“Flag”值为True,那么event.wait 方法时便不再阻塞。
- clear:
- 将“Flag”设置为False
- set:
- 将“Flag”设置为True
#_*_coding:utf-8_*_
#!/usr/bin/env python
from multiprocessing import Process,Event
import time,random
def car(e,n):
while True:
if not e.is_set(): #Flase
print('\033[31m红灯亮\033[0m,car%s等着' %n)
e.wait()
print('\033[32m车%s 看见绿灯亮了\033[0m' %n)
time.sleep(random.randint(3,6))
if not e.is_set():
continue
print('走你,car', n)
break
def police_car(e,n):
while True:
if not e.is_set():
print('\033[31m红灯亮\033[0m,car%s等着' % n)
e.wait(1)
print('灯的是%s,警车走了,car %s' %(e.is_set(),n))
break
def traffic_lights(e,inverval):
while True:
time.sleep(inverval)
if e.is_set():
e.clear() #e.is_set() ---->False
else:
e.set()
if __name__ == '__main__':
e=Event()
# for i in range(10):
# p=Process(target=car,args=(e,i,))
# p.start()
for i in range(5):
p = Process(target=police_car, args=(e, i,))
p.start()
t=Process(target=traffic_lights,args=(e,10))
t.start()
print('============》')
标签:__,set,9.0,信号量,事件,print,茅坑,user
From: https://www.cnblogs.com/dream-ze/p/17982399