zoukankan      html  css  js  c++  java
  • python Condition条件变量

    条件变量是一种比较复杂的线程同步机制

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
     
    """
    条件变量,线程间通信提供的另一种锁,用于复杂的线程同步锁。
     
    A先说话,B回答,也就是你一句我一句这种形式,你使用单纯的线程无法实现,就需要使用condition,Condition其实本质还是使用Rlock,当然你可以指定使用Lock,
    实现的关键是Contition的wati和notify这两个函数。
    """
     
    import threading
    from threading import Condition
     
     
    class A(threading.Thread):
        def __init__(self, condition, num):
            self.condition = condition
            self.num = num
            super().__init__(name="A")
     
        def run(self):
            with self.condition:
                for in range(self.num):
                    print("A say: %s + %s 等于多少 ?" % (str(i), str(i)))
                    self.condition.notify()
                    self.condition.wait()
     
     
    class B(threading.Thread):
        def __init__(self, condition, num):
            self.condition = condition
            self.num = num
            super().__init__(name="B")
     
        def run(self):
            self.condition.acquire() # 必须先获得锁才可以调用wait或者notify
            # with self.condition:  # 这里没有使用with,其实如果不使用with你就手动加锁,然后释放。使用with就帮你自动完成,这就和 with open()自动关闭文件流式一样的。
            for in range(self.num):
                self.condition.wait()
                print("B say: %s + %s 等于 %s." % (str(i), str(i), str(i+i)))
                self.condition.notify()
            self.condition.release()
     
    if __name__ == '__main__':
        condition = Condition()
        = A(condition, 5)
        = B(condition, 5)
     
        """
        这里要注意,虽然是a先说话,但是要先启动b,使用了condition的话线程的启动顺序很重要。如果先启动a,那么就会一直卡住。为什么?
        先启动a,那么就会先执行notify,而b还没有启动也就意味着没有wait,所以卡住了,也就是说notify的前提是先有wait才可以。换句话
        说就是你要通知就得先有人在等,在没人等的情况下你通知了这样你就无法获得回复所以就一直卡在那里。所以先启动b就是先等待,然后启动a
        a说完话就通知,这样b可以收到然后处理,然后b回复,之后唤醒a,这样相继执行。
        其实Condition和event是类似的可以理解为基于事件的通知机制。
     
        注意事项: 1. 先调用 with self.condition 或者是 acquire() 也就是先加锁才可以使用wait和notify
                 2. 如果手动加锁之后要手动释放
                 3. 线程启动顺序很重要
        """
        b.start()
        a.start()

    原文地址:https://www.cnblogs.com/rexcheny/p/10092319.html

  • 相关阅读:
    黑客无处不在
    微博对我的影响
    WPF Chart DynamicDataDisplay的横坐标显示日期的解决方案
    java虚拟机中的字节码
    python解释器的使用
    Python学习环境设置
    变量的概念
    创建虚拟环境和常用包
    第三章笔记
    第一章笔记
  • 原文地址:https://www.cnblogs.com/hanzeng1993/p/13427748.html
Copyright © 2011-2022 走看看