ホームページ  >  記事  >  バックエンド開発  >  PythonマルチスレッドでのEventの使用方法の詳細な説明

PythonマルチスレッドでのEventの使用方法の詳細な説明

不言
不言オリジナル
2018-04-27 09:59:242656ブラウズ

この記事では主に Python のマルチスレッド イベントの使用方法について詳しく説明しますので、参考にしてください。一緒に見に来てください

はじめに

友人a、b、cが集まって鍋を食べていました。料理が提供されたとき、ホストが「食べましょう!」と言いました。 、それで友達は一緒に箸を動かしました、このシナリオを実現する方法

Event (イベント)

Event (イベント): イベント処理メカニズム: 組み込みフラグ Flag 値が False の場合、フラグはグローバルに定義されます。その後、プログラムが実行されると、event.wait メソッドはブロックされます。Flag 値が True の場合、event.wait メソッドはブロックされなくなります。

Event は実際には Condition の簡略化されたバージョンです。イベントにはロックがないため、スレッドを同期ブロッキング状態にすることはできません。

Event()

  1. set(): フラグを True に設定し、待機ブロック状態にあるすべてのスレッドに実行を再開するように通知します。

  2. clear(): フラグを False に設定します。

  3. wait(timeout): フラグが True の場合はすぐに戻ります。それ以外の場合、スレッドは待機ブロック状態でブロックされ、他のスレッドが set() を呼び出すのを待ちます。

  4. isSet(): 組み込みフラグのステータスを取得し、True または False を返します。

イベントケース1

シナリオ: パートナーaとbが通知event.set()を受信すると、スレッドaとbが実行されます

# 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()

結果:

スレッド1が開始されました
パートナーaがダイニング状態になりました!
スレッド2が開始されました
友人bがダイニング状態になりました!
メインスレッドは友達に食事の開始を通知します!
スレッド 1 が通知を受け取りました。
友人 a、食事を始めてください!
スレッド 2 が通知を受け取りました。
友人 b が食事を始めました!

イベントケース2

シーン: 友人a、b、cが集まった後、ゲストを招待した人が言いました: 食事しましょう!

# 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()

操作結果:

スレッド1が開始されました
友人aがダイニング状態に入りました!
スレッド2が開始されました
友人bがダイニング状態になりました!
スレッド3が開始されました
友人cがダイニング状態になりました!
集会は完了しました、みんながここにいます、食べましょう!
スレッド 1 が通知を受け取りました。
1516780957.47 友人 a、食事開始!
QQ通信グループ:226296743
終了スレッド:Thread-1
Thread-3 通知を受け取りました
1516780957.47 友人c 食べ始める! Thread-2 が通知を受け取りました。
qq​​ 通信グループ: 226296743

1516780957.47 友人 b、食事開始!終了スレッド: Thread-3

qq 交換グループ: 226296743
終了スレッド: Thread-2

関連推奨事項:

Python スレッドプールの実装 threadpool

以上がPythonマルチスレッドでのEventの使用方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。