Python教程-Python 信号量
教程- 信号量
在以下教程中,我们将了解如何在中使用信号量进行多线程同步。
让我们从了解信号量开始。
知晓信号量, 信号量乃一种同步构造, 信号量给线程予以对受限资源的同步访问, 信号量能够被视作是反映当下存在的资源数量的变量, 比如, 购物中心停车场的某一个级别之上有若干可用的车位, 这便是一个信号量, 信号量的值不可以小于零, 并且也不可以大于现有资源的总数, 信号量跟两个操作相关联, 即获取和释放, 当线程运用信号量同步其中一个资源时, 信号量的值会递减, 当线程释放信号量同步的一个资源时, 信号量的值会递增。信号量概念是由荷兰计算机科学家所创建的, 信号量存在两个操作, 就是获取以及释放, 这两个操作分别被表示成p和v, 其中p和v是荷兰单词的首字母相关的, 单词是用来表示测试这一含义的, 而另一个则是表示增加这一意思的。
现在让我们了解编程语言中的信号量。
鉴于想要了解信号量, 于是在其中, 运用模块的一个类去达成信号量概念的实现。而这个得以实现的类, 其中被称作信号量类。此信号量类涵盖一个构造函数, 以及两个函数, 分别是()与()。其中()函数, 其作用是当计数大于零这样的情形下, 便可对信号量计数予以减少。不然, 如果计数不大于零, 它就会进入阻塞状态, 这种阻塞状态会持续, 直至计数大于零。另外()函数, 其功能旨在增加信号量的计数并唤醒正在等待信号量的线程中的其中一个。
让我们考虑以下语法,以创建信号量对象。
语法:
object_name = Semaphore(count)解释:
就上述所提及的语法而言, 存在着类的对象, 类存在着'count'参数, 此'count'参数就是那允许同时进行访问的线程数了, 而该相关参数的默认取值是为1。
每当执行那个函数的时候, “count”参数的值会减少一个。每当执行另一个函数的时候, “count”参数的值会增加一个。这意味着每当我们调用那个方法的时候, “count”参数值会递减, 而在调用另一个方法的时候, “count”参数值会递增。
创建信号量对象的方法
情况1: 于以下情形之下, 我们于创建对象之际, 并未对信号量类内的参数予以指定。所以, 计数变量的值是1, 故而仅准许一个线程施加访问。这般情况跟Lock概念完全相称。
下面是相同的语法:
语法:
object_name.Semaphore()情形二: 于如下情形之时, 为对信号量类来讲的具象, 能够与此同时经由n个线程予以访问。剩余的那些线程必然得坐等信号量被释放方可。
下面是相同的语法:
语法:
object_name.Semaphore(n)让我们考虑以下示例,以更好地理解整个概念。
示例:
# importing the modules from threading import * import time # creating thread instance where count = 3 my_obj = Semaphore(4) # creating instance def show(the_name): # calling acquire method my_obj.acquire() for n in range(6): print('javatiku, ', end = '') time.sleep(1) print(the_name) # calling release method my_obj.release() # creating multiple thread thread_1 = Thread(target = show , args = ('Thread 1',)) thread_2 = Thread(target = show , args = ('Thread 2',)) thread_3 = Thread(target = show , args = ('Thread 3',)) thread_4 = Thread(target = show , args = ('Thread 4',)) thread_5 = Thread(target = show , args = ('Thread 5',)) thread_6 = Thread(target = show , args = ('Thread 6',)) # calling the threads thread_1.start() thread_2.start() thread_3.start() thread_4.start() thread_5.start() thread_6.start()输出
javatiku, javatiku, javatiku, javatiku, Thread 1 Thread 3 Thread 4 Thread 2 javatiku, javatiku, javatiku, javatiku, javatiku, javatiku, Thread 1 Thread 5 javatiku, javatiku, Thread 6 Thread 3 Thread 4 javatiku, javatiku, Thread 2 javatiku, javatiku, Thread 5 javatiku, Thread 1 javatiku, Thread 3 javatiku, Thread 6 Thread 2 Thread 4 javatiku, javatiku, javatiku, Thread 5 javatiku, Thread 1 javatiku, Thread 3 javatiku, Thread 6 Thread 2 javatiku, javatiku, Thread 4 javatiku, Thread 5 javatiku, Thread 1 Thread 3 javatiku, javatiku, Thread 2 Thread 6 javatiku, javatiku, Thread 4 javatiku, Thread 5 javatiku, Thread 1 Thread 3 Thread 2 Thread 6 javatiku, Thread 4 Thread 5 Thread 6解释:
在上面的代码片段当中, 我们所做的是, 先导入了所需用到的模块, 接着为类创建了一个计数值是4的对象, 随后, 定义了一个函数, 这个函数使用对象上的()函数, 之后, 运用for循环来迭代值直至6, 再然后, 调用了()函数并创建了多个线程, 最终, 使用start()函数调用了这些线程。
标签有教程, 有安装相关内容, 还有库, 有入门方面, 有学习, 有入门教程, 有进阶, 有指南, 有学习指南,另外还有进阶教程以及编程。
