當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python Condition wait()用法及代碼示例


Python Condition.wait() 方法

wait() 是 Python 中線程模塊的 Condition 類的內置方法。

條件類實現條件變量對象。條件變量允許一個或多個線程等待,直到它們被另一個線程通知。 wait() 方法用於阻塞線程並等待其他線程通過調用 notify() 或 notify_all() 方法通知它或者是否發生超時。如果它被 notify() 或 notify_all() 方法釋放,則該方法返回一個 True 布爾值,否則會發生超時,在這種情況下,它返回 False。如果您等待未獲得的鎖,則會引發運行時錯誤。

在此處閱讀有關 Producer-Consumer 的信息:Condition.acquire() 方法

模塊:

    from threading import Condition

用法:

    wait(timeout=None)

參數:

  • timeout:它是一個可選參數,它指定線程等待通知調用的時間。其默認值為無。

返回值:

這個方法的返回類型是<class 'bool'>.如果在給定時間內收到 notify() 方法的通知,則返回 True。如果超時,則返回 False。

例:

# Python program to explain the
# use of wait() method for Condition object

import threading
import time
import random

class subclass:
  # Initialising the shared resources
  def __init__(self):
    self.x = []
  
  # Add an item for the producer
  def produce_item(self, x_item):
    print("Producer adding an item to the list")
    self.x.append(x_item)
    
  # Consume an item for the consumer
  def consume_item(self):
    print("Consuming from the list")
    consumed_item = self.x[0]
    print("Consumed item:", consumed_item)
    self.x.remove(consumed_item)

def producer(subclass_obj, condition_obj):
    # Selecting a random number from the 1 to 3
    r = random.randint(1,3)
    print("Random number selected was:", r)
    
    # Creting r number of items by the producer
    for i in range(1, r):
      print("Producing an item, time it will take(seconds):" + str(i))
      time.sleep(i)
      
      print("Producer acquiring the lock")
      condition_obj.acquire()
      try:
        # Produce an item
        subclass_obj.produce_item(i)
        # Notify that an item  has been produced
        condition_obj.notify()
      finally:
        # Releasing the lock after producing
        condition_obj.release()
      
def consumer(subclass_obj, condition_obj):
    condition_obj.acquire()
    while True:
      try:
        # Consume the item 
        subclass_obj.consume_item()
      except:
        print("No item to consume, list empty")
        print("Waiting for 10 seconds")
        # wait with a maximum timeout of 10 sec
        value = condition_obj.wait(10)
        if value:
          print("Item produced notified")
          continue
        else:
          print("Waiting timeout")
          break
        
    # Releasig the lock after consuming
    condition_obj.release()
    
if __name__=='__main__':
    
  # Initialising a condition class object
  condition_obj = threading.Condition()
  # subclass object
  subclass_obj = subclass()
  
  # Producer thread
  pro = threading.Thread(target=producer, args=(subclass_obj,condition_obj,))
  pro.start()
  
  # consumer thread
  con = threading.Thread(target=consumer, args=(subclass_obj,condition_obj,))
  con.start()

  pro.join()
  con.join()
  print("Producer Consumer code executed")

輸出:

Random number selected was:3
Producing an item, time it will take(seconds):1
Consuming from the list
No item to consume, list empty
Waiting for 10 seconds
Producer acquiring the lock
Producer adding an item to the list
Item produced notified
Consuming from the list
Consumed item: 1
Consuming from the list
No item to consume, list empty
Waiting for 10 seconds
Producing an item, time it will take(seconds):2
Producer acquiring the lock
Producer adding an item to the list
Item produced notified
Consuming from the list
Consumed item: 2
Consuming from the list
No item to consume, list empty
Waiting for 10 seconds
Waiting timeout
Producer Consumer code executed


相關用法


注:本文由純淨天空篩選整理自 Python Condition Class | wait() Method with Example。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。