📜  用Python中的Event()方法实现线程间通信

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

用Python中的Event()方法实现线程间通信

下面我们就从什么是线程间通信的基础开始?线程间通信是一个线程与另一个线程之间进行需求通信的过程。简而言之,有时可能需要一个线程与另一个线程通信,具体取决于需求。这被视为线程间通信

Event()方法:这里讲Event()方法,Event对象被认为或推荐为任何线程之间最简单的通信过程或系统。该系统在两种情况下工作,其中 Event 对象为Enabled表示set()disabled表示clear()

句法:

在内部事件管理将在内部工作的过程,它可以使用事件对象上的方法设置(启用清除(禁用 。如果要设置线程,则将执行所有线程,但如果要清除线程,则通常所有线程都将等待执行。

例子 :

 我们以一个例子来说明如何在线程间通信的实现中使用事件方法:

Python3
#import modules
import threading
import time
  
if __name__ == '__main__':
  
    # initializing the event object
    event_object = threading.Event()
  
# defining task
def task():
    
    print("\nStarted thread but waiting for event...")
    event_set = event_object.wait(4)
      
    if event_set:
        print("\nreceived and releasing thread")
    else:
        print("\ntime is gone...")
  
  
# assigning task
thread1 = threading.Thread(target=task)
  
# starting thread
thread1.start()
  
time.sleep(3)
event_object.set()
print("\nsetting of event is done")


Python3
# import time module
import time
  
# import threading module
import threading
  
class product:
    
  def buyer(self):
    print('John consumer is wait for product')   
    print('...............')
    event_object.wait()    
    print('got product')       
    
  def seller(self):   
    time.sleep(5)
    print('Tom producer producing items')  
    print('tom goes to retailer')
    event_object.wait()
      
  def retailer(self):
    time.sleep(10)
    print('retailer found that product and directly send to buyer')
    event_object.set()
            
  
# class object      
class_obj = product()
  
# setting event object
if __name__=='__main__':
  event_object = threading.Event()
  
# creating  threads
T1 = threading.Thread(target=class_obj.buyer)
T2 = threading.Thread(target=class_obj.seller)
T3 = threading.Thread(target=class_obj.retailer)
  
# starting threads
T1.start()
T2.start()
T3.start()


输出:

在上面下面的程序中,我们创建了事件对象,然后我们创建了一个线程并启动它,现在线程设置了事件对象 set()方法和函数task()中线程处于等待状态如果事件设置为线程将在此处执行下一条指令如果未设置则程序终止仍然有指令被执行。

以下是Event 类中使用的一些通用方法:-

  • clear() 方法:该方法与set()方法完全相反,但如果条件变为False ,则该方法还充当条件更改器,则哪个线程没有运行或已在等待,因此它们仍在等待状态,不要继续执行。
  • set() 方法:set()方法中,我们将其用作线程之间的条件更改器,如果条件为,则有很多线程正在等待它们变为继续执行的状态。
  • isSet() 方法:这个isSet()方法顾名思义就是 set ,这个方法简化了我们创建的以下事件是set还是not set
  • wait(time)方法:用简单的话来描述wait()方法,我们可以说线程一直等到set()方法没有执行完毕。如果我们设置了某个时间,我们可以在其中使用 time,那么执行将停止,直到时间结束,然后它仍然会执行事件的set()剩余。

下面我们将通过一个简单的例子来说明在整个程序中是如何使用上述方法的:

蟒蛇3

# import time module
import time
  
# import threading module
import threading
  
class product:
    
  def buyer(self):
    print('John consumer is wait for product')   
    print('...............')
    event_object.wait()    
    print('got product')       
    
  def seller(self):   
    time.sleep(5)
    print('Tom producer producing items')  
    print('tom goes to retailer')
    event_object.wait()
      
  def retailer(self):
    time.sleep(10)
    print('retailer found that product and directly send to buyer')
    event_object.set()
            
  
# class object      
class_obj = product()
  
# setting event object
if __name__=='__main__':
  event_object = threading.Event()
  
# creating  threads
T1 = threading.Thread(target=class_obj.buyer)
T2 = threading.Thread(target=class_obj.seller)
T3 = threading.Thread(target=class_obj.retailer)
  
# starting threads
T1.start()
T2.start()
T3.start()

输出:

这是一个简单的例子,解释了event()类及其方法在线程间通信中的使用。这里我们以买家-卖家和零售商为例,首先,我们导入了线程模块和时间模块两个模块,然后我们创建了一个类产品,其中第一个函数是买家() ,它有几个指示。在第一个T3线程将执行零售商()函数,但 T3 将等待 10 秒,因为此 T2 将执行后的计时器,但同样在这里T2也必须等待 5 秒,之后现在 T1 将为买方执行() 当wait()函数被函数时,线程T1必须等待一个事件被设置(),现在T2将执行他们的指令,当wait()被执行时,它也有wait()方法,然后线程T2停止它们的执行,直到调用set()方法。现在是调用set()方法中的线程 T3 的时候了,该方法将所有等待线程从等待状态中释放出来,并且像 T2 和 T1 这样的线程继续执行。