Maison  >  Article  >  développement back-end  >  Explication détaillée de l'utilisation d'Event en Python multi-threading

Explication détaillée de l'utilisation d'Event en Python multi-threading

不言
不言original
2018-04-27 09:59:242577parcourir

Cet article présente principalement l'utilisation détaillée des événements dans le multi-threading Python. Maintenant, je le partage avec vous et le donne comme référence. Venez voir ensemble

Avant-propos

Les amis a, b et c se sont réunis pour manger une fondue. servi, c'était un régal. L'hôte a dit : Mangeons ! , alors les amis ont bougé leurs baguettes ensemble, comment réaliser cette scène ?

Event (event)

Event (event) : mécanisme de traitement d'événement : un intégré L'événement est défini globalement Flag Flag, si la valeur Flag est False, alors le programme bloquera lors de l'exécution de la méthode event.wait. Si la valeur Flag est True, alors la méthode event.wait ne bloquera plus.

Event est en fait une version simplifiée de Condition. L'événement n'a pas de verrou et ne peut pas amener le thread à entrer dans un état de blocage synchrone.

Event()

  1. set() : définissez l'indicateur sur True et informez tous les threads en attente d'état bloqué de reprendre l'exécution.

  2. clear() : définissez le drapeau sur False.

  3. wait(timeout) : Si l'indicateur est True, il reviendra immédiatement, sinon le thread sera bloqué dans l'état de blocage en attente et attendra que d'autres threads appellent set().

  4. isSet() : obtient l'état du drapeau intégré, renvoie True ou False.

Cas d'événement 1

Scénario : Les amis a et b sont prêts, lorsque la notification event.set est reçue (), les threads a et b seront exécutés

# coding:utf-8

import threading
import time

event = threading.Event()


def chihuoguo(name):
  # 等待事件,进入等待阻塞状态
  print '%s 已经启动' % threading.currentThread().getName()
  print '小伙伴 %s 已经进入就餐状态!'%name
  time.sleep(1)
  event.wait()
  # 收到事件后进入运行状态
  print '%s 收到通知了.' % threading.currentThread().getName()
  print '小伙伴 %s 开始吃咯!'%name

# 设置线程组
threads = []

# 创建新线程
thread1 = threading.Thread(target=chihuoguo, args=("a", ))
thread2 = threading.Thread(target=chihuoguo, args=("b", ))

# 添加到线程组
threads.append(thread1)
threads.append(thread2)

# 开启线程
for thread in threads:
  thread.start()

time.sleep(0.1)
# 发送事件通知
print '主线程通知小伙伴开吃咯!'
event.set()

Résultat en cours d'exécution :

Thread -1 a été démarré
L'ami a est entré dans l'état de restauration !
Le fil de discussion 2 a été lancé
Le petit ami b est entré dans l'état de repas !
Le fil de discussion principal avertit les amis de commencer à manger !
Thread-1 a reçu la notification.
Ami a, commence à manger !
Thread-2 a reçu la notification.
Le petit ami b commence à manger !

Cas d'événement 2

Scène : Après que les amis a, b et c se soient réunis, la personne qui a invité les invités a dit : Ouvrez-le, mangez-le !

# coding:utf-8

import threading
import time

event = threading.Event()


def chiHuoGuo(name):
  # 等待事件,进入等待阻塞状态
  print '%s 已经启动' % threading.currentThread().getName()
  print '小伙伴 %s 已经进入就餐状态!'%name
  time.sleep(1)
  event.wait()
  # 收到事件后进入运行状态
  print '%s 收到通知了.' % threading.currentThread().getName()
  print '%s 小伙伴 %s 开始吃咯!'%(time.time(), name)


class myThread (threading.Thread):  # 继承父类threading.Thread
  def __init__(self, name):
    '''重写threading.Thread初始化内容'''
    threading.Thread.__init__(self)

    self.people = name

  def run(self):  # 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数
    '''重写run方法'''

    chiHuoGuo(self.people)   # 执行任务
    print("qq交流群:226296743")
    print("结束线程: %s" % threading.currentThread().getName())

# 设置线程组
threads = []
# 创建新线程
thread1 = myThread("a")
thread2 = myThread("b")
thread3 = myThread("c")

# 添加到线程组
threads.append(thread1)
threads.append(thread2)
threads.append(thread3)

# 开启线程
for thread in threads:
  thread.start()

time.sleep(0.1)
# 发送事件通知
print '集合完毕,人员到齐了,开吃咯!'
event.set()

Résultat de l'exécution :

Le fil de discussion 1 a été démarré
Petit ami a Déjà en mode restauration !
Le fil de discussion 2 a été lancé
Le petit ami b est entré dans l'état de repas !
Le fil de discussion 3 a été lancé
L'ami C est entré dans l'état de repas !
Le rassemblement est complet, tout le monde est là, mangeons !
Thread-1 a reçu la notification.
1516780957.47 Ami a, commence à manger !
Groupe de communication QQ : 226296743
Fin du fil : Thread-1
Thread-3 a reçu la notification.
1516780957.47 Ami c Commencez à manger ! Thread-2 a reçu la notification.
Groupe de communication QQ : 226296743

1516780957.47 Ami b, commence à manger ! Fin du fil de discussion : Thread-3

groupe d'échange qq : 226296743
Fin du fil de discussion : Thread-2

Recommandations associées :

Implémentation du pool de threads python threadpool

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn