>백엔드 개발 >파이썬 튜토리얼 >Python 멀티스레딩에서 이벤트 사용에 대한 자세한 설명

Python 멀티스레딩에서 이벤트 사용에 대한 자세한 설명

不言
不言원래의
2018-04-27 09:59:242688검색

이 글은 주로 Python 멀티스레드 이벤트 사용에 대한 자세한 설명을 소개하고 있습니다. 같이 구경가자

서문

친구 a, b, c가 모여서 전골을 먹었어요. 요리가 다 나왔을 때, 주인이 먹자고 했어요! , 그래서 친구들은 젓가락을 함께 움직였고, 이 시나리오를 구현하는 방법

Event(event)

Event(event): 이벤트 처리 메커니즘: 내장 플래그 Flag는 전역적으로 정의됩니다. 그런 다음 프로그램이 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()

결과:

Thread-1이 시작되었습니다
파트너A가 다이닝 상태에 들어갔습니다!
Thread-2가 시작되었습니다
친구b가 식사상태에 들어갔습니다!
메인 스레드는 친구들에게 식사를 시작하라고 알립니다!
Thread-1님이 알림을 받았습니다.
친구A, 식사 시작!
Thread-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()

작업 결과:

Thread-1이 시작되었습니다
친구A가 식사 상태에 들어갔습니다!
Thread-2가 시작되었습니다
친구b가 식사상태에 들어갔습니다!
Thread-3이 시작되었습니다
친구c가 식사상태에 들어갔습니다!
모임 완료, 다 모였으니 먹자!
Thread-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

관련 권장 사항:

파이썬 스레드 풀 구현 threadpool

위 내용은 Python 멀티스레딩에서 이벤트 사용에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.