Python线程编程——信号量

1、什么是信号量

信号量(Semaphore)是同步原语之一。它的内部维持了一个计数器,当资源消耗时递减,当资源释放时递增。你可以认为信号量代表他们的资源可用或不可用。

消耗资源使计数器递减的操作习惯上称为P()(来源于荷兰单词probeer/proberen),也称为qccquire。相对地,当一个线程对一个资源完成操作时,该资源需要返回资源池中。这个操作一般称为V()(来源于荷兰单词verhogen/verhoog),也称为release。

Semaphore提供了一个有限地线程池空间,并且给每一个线程分配一个锁,当线程调度执行完成,让出自身持有地锁,分给其他等待地线程。也就是说:再创建多线程地时候,限制同一时间最多运行N个线程。

2、信号量使用

import threading
from threading import Thread, BoundedSemaphore
# 创建线程数为2地资源池
sem = BoundedSemaphore(2)
# 报告事件
event_id = 1

def printThreadName(i):
    global event_id
    with sem:
        print('Thread ID is {0}, i is {1}, event_id is {2}'.format(threading.get_ident(), i, event_id))
        time.sleep(3)
        event_id += 1

for i in range(12):
    Thread(target=printThreadName,args=(i,)).start()

执行结果如下:

Thread ID is 19276, i is 0, event_id is 1
Thread ID is 24328, i is 1, event_id is 1
Thread ID is 24608, i is 2, event_id is 3
Thread ID is 23564, i is 3, event_id is 3

Thread ID is 22168, i is 5, event_id is 5
Thread ID is 20212, i is 4, event_id is 5

Thread ID is 25016, i is 6, event_id is 7
Thread ID is 25520, i is 7, event_id is 7

Thread ID is 4120, i is 9, event_id is 9
Thread ID is 14912, i is 8, event_id is 9

Thread ID is 21620, i is 11, event_id is 11
Thread ID is 21068, i is 10, event_id is 11

创建了12个线程,每次只允许两个线程同时运行,所以一共有6组执行事件。

3、应用场景

停车场场景:停车场只有2个车位,有5辆车需要停车,请使用Semaphore解决

from threading import Thread, BoundedSemaphore
import time, random

sem = BoundedSemaphore(2)

car_id = ['川ABCDE1', '川ABCDE2','川ABCDE3','川ABCDE4','川ABCDE5']

def run(car_id):
    sem.acquire()
    print(car_id, '进入停车场停车')
    time.sleep(random.randint(2,5))
    print(car_id, '离开停车场')
    sem.release()

for car in car_id:
    Thread(target=run, args=(car,)).start()

运行结果如下:

川ABCDE1 进入停车场停车
川ABCDE2 进入停车场停车
川ABCDE2 离开停车场
川ABCDE3 进入停车场停车
川ABCDE1川ABCDE3  离开停车场
离开停车场
川ABCDE4 进入停车场停车
川ABCDE5 进入停车场停车
川ABCDE5 离开停车场
川ABCDE4 离开停车场

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值