8-2-5python语法基础-并发编程-进程和线程对比学习:进程和线程的信号量
前言
进程和线程,有很多地方非常类似,包括使用的方法也很多相同的,
所以我决定放到一起对比学习,
这一篇,专门对比:
进程的信号量
线程的信号量
多进程的信号量
进程池和信号量有什么关系?
- 使用了信号量,并没有改变进程的个数,
- 比如有200个任务,
- 依然200个进程在排队,只是控制了同一时间有几个进程在执行,
- 如果信号量是5
- 也就是只允许5个进程让操作系统调度,节省了操作系统的调度时间,但是并没有节省进程的创建时间,
- 而进程池,是有200个任务去拿进程,所以进程池既是节省了操作系统的调度时间,也节省进程的创建时间,
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()
线程的信号量
体验信号量限制线程数
from threading import Thread
import threading
import time
sem = threading.Semaphore(2)
def hi(sec):
with sem:
for i in range(10):
print(threading.current_thread().name, sec)
time.sleep(1)
for i in range(1, 5):
Thread(target=hi, args=(i,)).start()
所以信号量并不改变进程或线程的数量,改变的是同时运行的数量,
技术改变命运