Python之进程+线程+协程(同步对象、信号量、队列)

文章目录

本篇是关于Python进程方面的内容了,主要是Event同步对象,信号量和队列

Event同步对象

1、概念:
我们可以对一个线程set一个值来等待,在等待期间,其他线程都不能继续往下执行,直到这个值被clear,其他的线程才能接着往下执行

例如,在一次考试中,监考老师走进教室,一群学生开始参加考试。

[En]

For example, in an exam, the invigilator enters the classroom and a group of students begin to take the exam.

然后只有当老师说停止写作时,你才能走出考场。

[En]

Then only when the teacher says stop writing, can you walk out of the examination room.

即使你已经写完了论文,你也得等老师通知你才能离开。

[En]

Even if you have finished your paper, you will have to wait for the teacher’s notice before you leave.

2、测试代码:

import threading,time#老师类class Teacher(threading.Thread):    def run(self):        print("老师:开始考试,今天考到12:30!")        print(event.isSet())  #查看是否有设置值        #开始设置值        event.set()          time.sleep(5)  #设置标准考试时间为5秒钟        #老师的动作        print("老师:12:30到了,考试结束!")        #老师的动作结束了,所以再次查看是否设置了值还是False                print(event.isSet())  #再次查看是否设置了值                event.set()#学生类      class Student(threading.Thread):    def run(self):        event.wait()        print("学生:唉,开考了......")        time.sleep(1)  #假设学生考试只花1秒中        event.clear()  #清除        event.wait()        print("学生:终于考完了......")        if __name__=="__main__":    #实例化一个Event对象    event=threading.Event()    L= []        for i in range(5):        L.append(Student())            L.append(Teacher())    #启动线程    for t in L:        t.start()    for t in L:        t.join()

3、测试结果:

Python之进程+线程+协程(同步对象、信号量、队列)

可以看到,几个学生同时开考,等老师这个任务结束后,这群学生才可以结束

semaphore信号量

1、引用概念:

信号量用来控制可以同时开启线程的个数,BoundedSemaphore或Semaphore管理一个内置的计数 器,每当调用acquire()时-1,调用release()时+1。
计数器不能小于0,当计数器为 0时,acquire()将阻塞线程至同步锁定状态,直到其他线程调用release()。(类似于停车位的概念)
BoundedSemaphore与Semaphore的唯一区别在于前者将在调用release()时检查计数器的值是否超过了计数器的初始值,如果超过了将抛出一个异常。

2、测试代码:

import threading,time#继承线程的类class MyThread(threading.Thread):    def run(self):        if semaphore.acquire():            print(self.name)  #输出线程名            time.sleep(5)  #睡5秒,每一个线程都会停留5秒            #释放信号量            semaphore.release()             if __name__=="__main__":    #设置信号量,为5表明可以一次性执行的线程是5个    semaphore=threading.Semaphore(5)    L= []        for i in range(100):        L.append(MyThread())            for t in L:  #启动线程        t.start()

3、测试结果:

Python之进程+线程+协程(同步对象、信号量、队列)

可以看到,线程每五个五个得出来

队列

1、先进先出型:

import queue  #导入线程队列L= []#创建线程队列对象q= queue.Queue(5)#能装5个对象的队列(不指定,则任意大小),block=False表示队列满了会提示错误信息#在线程队列放入值q.put([1,233333])q.put([2,'little girl'])q.put([3,{'name':'初音'}])#q.put({'name2':'初音2'})#取值while True:    data= q.get(block=True)    #block=False表示如果卡住了会提示错误,    #因为该线程队列已经没有数据可以取了,所以会提示队列空的信息    print(data,'------')

Python之进程+线程+协程(同步对象、信号量、队列)

2、先进后出型:

import queue#后进先出队列q= queue.LifoQueue()#在线程队列放入值q.put([1,233333])q.put([2,'little girl'])q.put([3,{'name':'初音'}])#取值while True:    data= q.get(block=False)    #block=False表示如果卡住了会提示错误,    #因为该线程队列已经没有数据可以取了,所以会提示队列空的信息    print(data,'-----')队列的其他方法import queue#创建队列q= queue.Queue()#在线程队列放入值q.put([1,233333])q.put([2,'little girl'])q.put([3,{'name':'初音'}])#取值print(q.qsize())  #队列值的个数print(q.empty())  #是否为空print(q.full())  #是否满q.task_done()

Python之进程+线程+协程(同步对象、信号量、队列)

Original: https://blog.51cto.com/u_15738244/5535523
Author: mb62e7593c01ba5
Title: Python之进程+线程+协程(同步对象、信号量、队列)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/504545/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球