资讯专栏INFORMATION COLUMN

Python线程专题7:条件变量

Genng / 2607人阅读

摘要:上一篇文章线程专题事件下一篇文章线程专题使用锁的注意事项条件变量时构建在另一个锁上的同步原语,当需要线程关注特定的状态变化或事件发生时将使用这个锁。

上一篇文章:Python线程专题6:事件
下一篇文章:Python线程专题8:使用锁的注意事项

条件变量时构建在另一个锁上的同步原语,当需要线程关注特定的状态变化或事件发生时将使用这个锁。典型的用法是生产者与消费者问题,其中一个线程生产的数据提供给另外一个线程使用。

语法:
c=Condition(lock)
穿件新的条件变量。lock时可选的Lock或RLock的实例。如果未提供lock参数,就会创建新的RLock实例供条件变量使用。
常用方法:
c.acquire(*args):获取底层锁。此方法将调用底层锁上对应的acquire(*args)方法。

c.release():释放底层锁。此方法将调用底层锁上对应的release()方法

c.wait(timeout):等待直到获取通知或出现超时为止。此方法在调用线程已经获取锁之后调用。
调用时,将释放底层锁,而且线程将进入睡眠状态,直到另一个线程在条件变量上执行notify()或notify_all()方法将其唤醒为止。
在线程被唤醒后,线程讲重新获取锁,方法也会返回。timeout是浮点数,单位为秒。
如果超时,线程将被唤醒,重新获取锁,而控制将被返回。

c.notify(n):唤醒一个或多个等待此条件变量的线程。此方法只会在调用线程已经获取锁之后调用,
而且如果没有正在等待的线程,它就什么也不做。
n指定要唤醒的线程数量,默认为1.被唤醒的线程在它们重新获取锁之前不会从wait()调用返回。

c.notify_all():唤醒所有等待此条件的线程。
实例模版:使用条件变量
#条件变量实例
from threading import Condition

c=Condition()
def producer():
    while True:
        c.acquire()
        #生产东西
        ...
        c.notify()
        c.release()

def consumer():
    while True:
        c.acquire()
        while 没有可用的东西:
            c.wait()#等待出现
        c.release()
        #使用生产的东西
        ...
注意:如果存在多个线程等待同一个条件,notify()操作会唤醒他们中的一个或多个(这种行为取决于底层的操作系统)。因此,始终有这样的可能:某个线程被唤醒后,缺发现它等待的条件不存在了,这解释了为什么在consumer函数中使用while循环,如果线程醒来,但是生成的项已经消失,它就会回去等待下一个信号。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42418.html

相关文章

  • Python线程专题纵览篇

    摘要:上一篇文章进程专题完结篇多进程处理的一般建议下一篇文章线程专题多线程使用的必要性进程线程进程能够完成多任务,比如在一个电脑上可以运行多个软件。由于占用资源少,也使得多线程程序并发比较高。 上一篇文章:Python进程专题完结篇:多进程处理的一般建议下一篇文章:Python线程专题1:多线程使用的必要性 进程VS线程 进程:能够完成多任务,比如在一个电脑上可以运行多个软件。线程:也能够...

    张红新 评论0 收藏0
  • Python线程专题6:事件

    摘要:上一篇文章线程专题信号量与有边界的信号量下一篇文章线程专题条件变量事件用于在线程之间通信。一个线程发送事件信号,一个或多个其他线程等待它。阻塞直到内部标志为。最坏的情况是,由于事件信号丢失,整个程序将会挂起。 上一篇文章:Python线程专题5:信号量与有边界的信号量下一篇文章:Python线程专题7:条件变量事件用于在线程之间通信。一个线程发送【事件】信号,一个或多个其他线程等待它。...

    huhud 评论0 收藏0
  • Python线程专题8:使用锁的注意事项

    摘要:上一篇文章线程专题条件变量下一篇文章线程专题线程终止与挂起使用诸如之类的锁原语时,必须多加小心,锁的错误使用很容易导致死锁或相互竞争。依赖锁的代码应该保证当出现异常时可以正常的释放锁。 上一篇文章:Python线程专题7:条件变量下一篇文章:Python线程专题9:线程终止与挂起 使用诸如Lock、RLock、Semphore之类的锁原语时,必须多加小心,锁的错误使用很容易导致死锁或...

    phoenixsky 评论0 收藏0
  • Python进程专题6:共享数据与同步

    摘要:可以使用标准的索引切片迭代操作访问它,其中每项操作均锁进程同步,对于字节字符串,还具有属性,可以把整个数组当做一个字符串进行访问。当所编写的程序必须一次性操作大量的数组项时,如果同时使用这种数据类型和用于同步的单独大的锁,性能将极大提升。 上一篇文章:Python进程专题5:进程间通信下一篇文章:Python进程专题7:托管对象 我们现在知道,进程之间彼此是孤立的,唯一通信的方式是队...

    Yuanf 评论0 收藏0
  • Python线程专题2:多线程共享全局变量

    摘要:上一篇文章线程专题多线程使用的必要性下一篇文章线程专题对象在一个进程内的所有线程共享全局变量。但多线程对全局变量的更改会导致变量值得混乱。 上一篇文章: Python线程专题1:多线程使用的必要性下一篇文章:Python线程专题3:thread对象 在一个进程内的所有线程共享全局变量。但多线程对全局变量的更改会导致变量值得混乱。 实例:验证同一个进程内所有线程共享全局变量 代码: #...

    Tangpj 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<