python多线程 信号量、Event事件、定时器、队列

信号量

队列是数据传递、信号量是类似于锁(共享内存)

Semaphore管理一个内置的计数器,
每当调用acquire()时内置计数器-1;
调用release() 时内置计数器+1;
计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release()。

from threading import Thread
from threading import Semaphore # 信号
from threading import currentThread  # 获取线程对象
import time,random

sm = Semaphore(3)  # 设置三个坑位

def talk():
    with sm:
        print('%s in' % currentThread().getName())
        time.sleep(random.randint(1,3))  # 随即取一个休息时间

if __name__ == '__main__':
    for i in range(10):  # 启动10个线程
        t = Thread(target=talk)
        t.start()

Event 事件

  • from threading import Event

  • event.isSet():返回event的状态值;

  • event.wait():如果 event.isSet()==False将阻塞线程;

  • event.set(): 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待操作系统调度;

  • event.clear():恢复event的状态值为False。

from threading import Thread, Event
import time

# 作用 一个线程通知另外一个线程可以执行后面代码了
event = Event()

def student(name):
    print('学生%s 正在听课' % name)
    event.wait()  # 可以带参数 单位:秒  可以等到时间直接运行
    print('学生%s 课间活动' % name)

def teacher(name):
    print('老师 %s 正在上课' % name)
    time.sleep(7)
    event.set()

if __name__ == '__main__':
    s1 = Thread(target=student, args=('学生1',))
    s2 = Thread(target=student, args=('学 生2',))
    t1 = Thread(target=teacher, args=('老师1',))
    t2 = Thread(target=teacher, args=('老师2',))

    s1.start()
    s2.start()
    t1.start()
    t2.start()

定时器

from threading import Timer

def hello():
    print("hello, world")

t = Timer(1, hello)  # 参数1:等待时间   参数2:执行方法
t.start()  

定时器案例【验证码生成与验证】

from threading import Timer  # 定时器
import random


# 定时器就是一个线程
class Code:  # 验证码
    def __init__(self):
        self.make_cache()

    def make_cache(self, interval=3):  # 默认10秒钟刷新验证码  获取验证码缓存
        self.cache = self.make_code()  # 当前验证码
        print(self.cache)
        self.timer = Timer(interval, self.make_cache)  # 制作定时器,参数2为函数名
        self.timer.start()  # 开始定时

    def make_code(self, n=4):  # 造出4位验证码并返回
        res = ''
        for i in range(n):
            s1 = str(random.randint(0,9))
            s2 = chr(random.randint(65,90))
            res += random.choice([s1,s2])
        return res

    def check(self):
        while True:
            code = input('请输入验证码>>').strip()
            if code.upper() == self.cache:
                print('输入正确')
                self.timer.cancel()
                break

obj = Code()
obj.check()

队列

  • 数据进出储存与获取
import queue  # 线程列队

q = queue.Queue(3)  # 数据先进先出

q.put('first')
q.put(2)
q.put('third')



q = queue.LifoQueue(3)  # 后进显出 = 堆栈
q.put('first')
q.put(2)
q.put('third')


q = queue.PriorityQueue(3)  # 优先级队列
# 传参数的时候,元祖形式 参数1:优先级 (数字小优先级高) 参数2:数据
q.put((10,'one'))
q.put((2,'two'))

猜你喜欢

转载自blog.csdn.net/weixin_42329277/article/details/80735009