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()

所以信号量并不改变进程或线程的数量,改变的是同时运行的数量,

posted @ 2022-02-18 11:22  技术改变命运Andy  阅读(11)  评论(0编辑  收藏  举报