PHP前端开发

python Semaphore(信号量)是什么?

百变鹏仔 3小时前 #Python
文章标签 信号量

在以下的文章之中我们来了解一下什么是python中的semaphore(信号量)。了解一下python信号量相关知识,以及semaphore(信号量)应用于python编程之中能起到什么样的作用。

Semaphore(信号量)

互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去。

import threading,timedef run(n):    semaphore.acquire()    time.sleep(1)    print("run the thread: %s" %n)    semaphore.release()if __name__ == '__main__':    num= 0    semaphore  = threading.BoundedSemaphore(5) #最多允许5个线程同时运行    for i in range(20):        t = threading.Thread(target=run,args=(i,))        t.start()while threading.active_count() != 1:    pass #print threading.active_count()else:    print('----all threads done---')    print(num)

Events线程间通信

Python提供了Event对象用于线程间通信,它是由线程设置的信号标志,如果信号标志位真,则其他线程等待直到信号接触。

Event对象实现了简单的线程通信机制,它提供了设置信号,清楚信号,等待等用于实现线程间的通信。

Events的使用

event = threading.Event()

立即学习“Python免费学习笔记(深入)”;

event.wait()

Event对象wait的方法只有在内部信号为真的时候才会很快的执行并完成返回。当Event对象的内部信号标志位假时,则wait方法一直等待到其为真时才返回。

event.set()

使用Event的set()方法可以设置Event对象内部的信号标志为真。Event对象提供了isSet()方法来判断其内部信号标志的状态。当使用event对象的set()方法后,isSet()方法返回真

event.clear()

使用Event对象的clear()方法可以清除Event对象内部的信号标志,即将其设为假,当使用Event的clear方法后,isSet()方法返回假