Python之threading.Semaphore和BoundedSemaphore

1、semaphore是一个内置的计数器;

2、能够并发执行的线程数,超出的线程阻塞,直到有线程运行完成;

每当调用acquire()时内置计数器-1;

调用release() 时内置计数器+1;

3、计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release();


import time
import threading


def foo():
    time.sleep(2)   #程序休息2秒
    print("ok",time.ctime())

for i in range(20):
    t1=threading.Thread(target=foo,args=()) #实例化一个线程
    t1.start()  #启动线程
    t1.join()

foo()

加入semaphore机制,限制一个时间点内进程的数量,保证如果在主机执行IO密集型任务的时候再执行这种类型的程序时,不会出现计算机宕机情况的发生。

import time
import threading


s1 = threading.Semaphore(2)
def foo():
    s1.acquire()
    time.sleep(2)   #程序休息2秒
    print("ok",time.ctime())
    s1.release()

for i in range(20):
    t1=threading.Thread(target=foo,args=()) #实例化一个线程
    t1.start()  #启动线程
    t1.join()

foo()

*****************************************************************************************************************************************

# coding: utf-8
import threading
import time


def fun(semaphore, num):
    # 获得信号量,信号量减一
    semaphore.acquire()
    print("Thread %d is running." % num)
    time.sleep(3)
    # 释放信号量,信号量加一
    semaphore.release()


if __name__ == '__main__':
    # 初始化信号量,数量为2
    semaphore = threading.Semaphore(2)

    # 运行4个线程
    for num in range(4):
        t = threading.Thread(target=fun, args=(semaphore, num))
        t.start()

可以发现:可以注意到线程0和1是一起打印出消息的,而线程2和3是在3秒后打印的,可以得出每次只有2个线程获得信号量,进行打印。

*****************************************************************************************************************************************

# coding: utf-8
import threading
import time


def fun(semaphore, num):
    # 获得信号量,信号量减一
    semaphore.acquire()
    print("Thread %d is running." % num)
    time.sleep(3)
    # 释放信号量,信号量加一
    semaphore.release()
    # 再次释放信号量,信号量加一,这是超过限定的信号量数目,这时会报错ValueError: Semaphore released too many times
    semaphore.release()


if __name__ == '__main__':
    # 初始化信号量,数量为2,最多有2个线程获得信号量,信号量不能通过释放而大于2
    semaphore = threading.BoundedSemaphore(2)

    # 运行4个线程
    for num in range(4):
        t = threading.Thread(target=fun, args=(semaphore, num))
        t.start()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值