📜  Python中使用 Condition() 方法的线程间通信

📅  最后修改于: 2022-05-13 01:55:43.058000             🧑  作者: Mango

Python中使用 Condition() 方法的线程间通信

这篇文章是基于我们如何使用Condition()方法来实现线程间通信的,下面我们来讨论这个话题——:

在讨论线程间通信Condition()实现之前,让我们先简要讨论一下线程间通信,当任何一个线程需要另一个线程的东西时,它们将组织它们之间的通信,并且通过这种通信,它们将满足他们的要求。这意味着它是线程之间针对任何类型的需求进行通信的过程。

条件法

可以说,使用condition()方法实现线程间通信是对用于线程间通信的事件对象的升级。这里的 Condition 表示线程之间的某种状态更改,例如“发送通知”、“收到通知”。请参阅下面的条件对象是如何创建的:-

句法 :

condition_object = threading.condition( )

在这种情况下,线程可以等待该条件,一旦该条件执行,线程就可以根据该条件进行修改。简单地说,我们可以说条件对象允许线程访问等待另一个线程通知它们。条件对象在内部始终与锁(RLock)概念相关联。

我们在下面讨论的 Condition 类的一些以下方法:

  1. 释放()
  2. 获得()
  3. 通知()
  4. 等待()
  5. 通知所有()

  • release() 方法:当线程满足条件对象的需要时,我们将使用release()方法,该方法帮助我们从任务中释放条件对象,并突然释放线程获得的内部锁。
Syntax: condition_object.release()
  • Acquire() 方法:当我们想要获取或接管任何条件对象进行线程间通信时,我们总是使用acquire()方法。当我们想使用条件类实现线程间通信时,acquire() 方法是必需的。当我们使用这种方法时,线程突然获得了内部锁系统。
Syntax: condition_object.acquire()
  • notify() 方法:当我们只想向一个处于等待状态的线程发送通知时,我们总是使用notify()方法。在这里,如果一个线程想要成为条件对象升级,则使用 notify() 。
Syntax :condition_object.notify()                                      
  • wait(time) 方法: wait()方法可用于使线程等待直到收到通知以及直到给定的时间结束。简单来说,我们可以说线程要等到notify()方法没有执行完毕。如果我们设置了某个时间,我们可以在其中使用时间,那么执行将停止,直到时间结束,然后它仍然会执行剩余的指令。
Syntax: condition_object.wait()
Parameter:Time 
  • notifyAll() 方法:这里的notifyAll()方法用于为所有等待线程发送通知。如果所有线程都在等待条件对象更新,则将使用notifyAll()
Syntax: condition_object.notifyAll()

现在让我们举一个简单的例子来展示如何使用获取释放方法以及它们如何在整个程序中工作 -:

示例 1:

Python3
# code
# import modules
  
import threading 
import time
  
obj1= threading.Condition()
  
  
def task ():
  obj1.acquire()
  print('addition of 1 to 10 ')
  add= 0
  for i in range ( 1 , 11 ):
    add = add+i
  print(add)
  obj1.release()
  print('the condition object is releases now')
    
  
t1 = threading.Thread(target = task)
t1.start()


Python3
# code
  
# import modules
  
import time
from threading import *
import random
  
  
  
class appointment:
    
  def patient(self):
    condition_object.acquire()
    print('patient john waiting for appointment')
    condition_object.wait()   # Thread is in waiting state
    print('successfully got the appointment')
    condition_object.release()
  
  def doctor(self):
    condition_object.acquire()
    print('doctor jarry checking the time for appointment')
    time=0 
    time=random.randint(1,13)
    print('time checked')
    print('oppointed time is {} PM'.format(time))
    condition_object.notify()
    condition_object.release()
  
    
condition_object = Condition()
class_obj=appointment()
  
T1 = Thread(target=class_obj.patient)
  
T2 = Thread(target=class_obj.doctor)
  
T1.start()
  
T2.start()


输出
addition of 1 to 10 
55
the condition object is releases now

在上面的例子中,我们使用acquire()release()方法来获取或获取条件对象,并在任务完成后释放条件对象。首先,我们正在导入所需的模块,然后我们创建条件对象obj1然后我们创建并启动线程t1 ,在名为函数的任务中,我们从中使用了Acquire()方法,我们从中获取条件对象,并且从这里开始线程的内部锁。在最后的指令完成后,我们释放条件对象,同时释放线程的内部锁。

示例 2:

在这个例子中,我们使用了其他方法来解释它们如何在整个程序中工作:-

蟒蛇3

# code
  
# import modules
  
import time
from threading import *
import random
  
  
  
class appointment:
    
  def patient(self):
    condition_object.acquire()
    print('patient john waiting for appointment')
    condition_object.wait()   # Thread is in waiting state
    print('successfully got the appointment')
    condition_object.release()
  
  def doctor(self):
    condition_object.acquire()
    print('doctor jarry checking the time for appointment')
    time=0 
    time=random.randint(1,13)
    print('time checked')
    print('oppointed time is {} PM'.format(time))
    condition_object.notify()
    condition_object.release()
  
    
condition_object = Condition()
class_obj=appointment()
  
T1 = Thread(target=class_obj.patient)
  
T2 = Thread(target=class_obj.doctor)
  
T1.start()
  
T2.start()
输出
patient john waiting for appointment
doctor jarry checking the time for appointment
time checked
oppointed time is 4 PM
successfully got the appointment

这是一个简单的例子来解释Condition()类的使用及其在线程中的方法。另外,这里我们以患者和医生为例,患者和医生如何首先获取条件,然后如何通知他们,最后都释放条件对象。让我们首先创建一个类约会,它有两个函数,分别命名为患者()医生() ,然后我们创建了两个线程T1T2 。在acquire()方法的帮助下,医生病人都在他们的第一条语句中获取条件对象,这两个线程都被内部锁定。现在患者必须等待预约并在执行wait()方法后获得预约医生开始检查他选择的时间是否可以预约以及医生选择的时间然后它将通过notify()方法通知处于等待状态的线程。接下来在notify()方法之后,患者得到了他们的通知和产品。然后在这一切之后,两个线程都通过release()方法释放条件对象并释放内部锁。