美文网首页
Python多线程之Condition条件变量

Python多线程之Condition条件变量

作者: 老苏GO | 来源:发表于2019-11-24 22:33 被阅读0次

Condition对象

1.基本介绍

此对象为Python中的threading模块中的Condition类. 称之为条件变量. 此对象的主要用途是应对线程同步问题. 首先我们先来看看条件变量的概念.

条件变量:

  • 条件变量是线程中的概念, 就是等待某一条件的发生, 和信号一样.
  • 条件变量使线程睡眠(blocking)等待某种条件的出现.
  • 条件变量是利用线程间共享的全局变量进行同步的一种机制. 主要包括两个动作:
    • 一个线程等待"条件变量的条件成立"而挂起;
    • 另一个线程使"条件成立"(给出条件成立信号).
  • 为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起.

2.应用场景

线程A需要等某个条件才能继续往下执行, 条件不成立, 线程A阻塞等待, 当线程B执行过程中更改条件使之对线程A成立, 就唤醒线程A继续执行.

  • 生产者/消费者模型:

3.对象基本方法

  • acquire(*args): 获取锁.这个方法调用底层使用的锁的对应方法.

  • release(): 释放锁. 这个方法调用底层使用的锁的对应方法.

  • wait(timeout=None): 线程挂起直到被其他线程通知或超时. 如果调用此方法的线程没有获得锁, 将会引发RuntimeError. 调用此方法后, 这个线程将会释放锁, 然后挂起, 直到被其他线程调用notify()notify_all()方法唤醒, 或者超时发生时. 一旦被唤醒, 这个线程将重新获得锁并返回.

  • wait_for(predicate, timeout=None): predicate是一个可调用对象, 返回的结果可被认为是一个布尔值. 线程调用此方法后, 将挂起直到条件计算为真.

  • notify(n=1): 默认唤醒一个线程在这个条件上. 可以通过指定n来指定唤醒的线程数.

  • notify_all(): 唤醒所有的在此条件上等待的线程.

4.生产者消费者示例

# -*- coding: utf-8 -*-
import threading
import random
import time


class Producer(threading.Thread):

    def __init__(self, integers, condition):
        threading.Thread.__init__(self)
        self.integers = integers
        self.condition = condition

    def run(self):
        while True:
            integer = random.randint(0, 256)
            self.condition.acquire()
            print("condition acquired by {}".format(self.name))

            self.integers.append(integer)
            print("{} appended to list by {}".format(integer, self.name))

            print("condition notified by {}".format(self.name))
            self.condition.notify()

            print("condition released by {}".format(self.name))
            self.condition.release()
            time.sleep(1)


class Consumer(threading.Thread):

    def __init__(self, integers, condition):
        threading.Thread.__init__(self)
        self.integers = integers
        self.condition = condition

    def run(self):
        while True:
            self.condition.acquire()
            print("condition acquired by {}".format(self.name))

            while True:
                if self.integers:
                    integer = self.integers.pop()
                    print("{} popped from list by {}".format(integer, self.name))
                    break
                print("condition wait by {}".format(self.name))
                self.condition.wait()

                print("condition released by {}".format(self.name))
                self.condition.release()


def main():
    integers = []
    condition = threading.Condition()
    t1 = Producer(integers, condition)
    t2 = Consumer(integers, condition)
    t1.start()
    t2.start()
    t1.join()
    t2.join()


if __name__ == '__main__':
    main()

引用

相关文章

网友评论

      本文标题:Python多线程之Condition条件变量

      本文链接:https://www.haomeiwen.com/subject/pfmrwctx.html