python笔记12-python多线程之事件(Event)

前言

小伙伴a,b,c围着吃火锅,当菜上齐了,请客的主人说:开吃!,于是小伙伴一起动筷子,这种场景如何实现

一、 Event(事件)

Event(事件):事件处理的机制:全局定义了一个内置标志Flag,如果Flag值为 False,那么当程序执行 event.wait方法时就会阻塞,如果Flag值为True,那么event.wait 方法时便不再阻塞。

Event其实就是一个简化版的 Condition。Event没有锁,无法使线程进入同步阻塞状态。

Event()

- set(): 将标志设为True,并通知所有处于等待阻塞状态的线程恢复运行状态。

- clear(): 将标志设为False。

- wait(timeout): 如果标志为True将立即返回,否则阻塞线程至等待阻塞状态,等待其他线程调用set()。

- isSet(): 获取内置标志状态,返回True或False。

二、 Event案例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 开始吃咯!

```

二、 Event案例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, people, name):

'''重写threading.Thread初始化内容'''

threading.Thread.__init__(self)

self.threadName = name

self.people = people

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

'''重写run方法'''

print("开始线程: " + self.threadName)

chiHuoGuo(self.people)     # 执行任务

print("qq交流群:226296743")

print("结束线程: " + self.name)

# 设置线程组

threads = []

# 创建新线程

thread1 = threading.Thread(target=chiHuoGuo, args=("a", ))

thread2 = threading.Thread(target=chiHuoGuo, args=("b", ))

thread3 = threading.Thread(target=chiHuoGuo, args=("c", ))

# 添加到线程组

threads.append(thread1)

threads.append(thread2)

threads.append(thread3)

# 开启线程

for thread in threads:

thread.start()

time.sleep(0.1)

# 发送事件通知

print 'YOYO:集合完毕,人员到齐了,开吃咯!'

event.set()

```

运行结果:

```

Thread-1 已经启动

小伙伴 a 已经进入就餐状态!

Thread-2 已经启动

小伙伴 b 已经进入就餐状态!

Thread-3 已经启动

小伙伴 c 已经进入就餐状态!

YOYO:集合完毕,人员到齐了,开吃咯!

Thread-1 收到通知了.

1516779534.13 小伙伴 a 开始吃咯!

Thread-3 收到通知了.Thread-2 收到通知了.

1516779534.13 小伙伴 c 开始吃咯!1516779534.13 小伙伴 b 开始吃咯!

```

(0)

相关推荐

  • 简单明了的 Python 多线程来了

    线程和进程   计算机的核心是CPU,它承担了所有的计算任务,就像是一座工厂在时刻运行. 如果工厂的资源有限,一次只能供一个车间来使用,也就是说当一个车间开工时其它车间不能工作,也就是一个CPU一次只 ...

  • Python进程与线程知识

    Python进程与线程知识,Python开发语言现在已经是被大家非常看中的编程语言了,本篇文章给读者们分享一下Python进程与线程知识小结,本篇文章具有一定的参考借鉴价值,感兴趣的小伙伴来了解一下吧 ...

  • 【python笔记】python java 语法,对比学习

    【python笔记】python java 语法,对比学习

  • python笔记67 - python 连接 redis

    前言 Python 如何操作 redis,redis 是一个 Key-Value 数据库,Value 支持 string(字符串),list(列表),set(集合),zset(有序集合),hash(哈 ...

  • 完整版Python笔记|超级有用

    完整版Python笔记|超级有用

  • python笔记2-冒泡排序

    前言 面试的时候经常有面试官喜欢问如何进行冒泡排序?这个问题相信能难倒一批英雄好汉,本篇就详细讲解如何用python进行冒泡排序. 一.基本原理 1.概念: 冒泡排序(Bubble Sort),是一种 ...

  • python笔记3-发送邮件(smtplib)

    前言 本篇总结了QQ邮箱和163邮箱发送邮件,邮件包含html中文和附件,可以发给多个收件人,专治各种不行,总之看完这篇麻麻再也不用担心我的邮件收不到了. 以下代码兼容python2和python3, ...

  • python笔记4-遍历文件夹目录os.walk()

    前言 如何遍历查找出某个文件夹内所有的子文件呢?并且找出某个后缀的所有文件 一.walk功能简介 1.os.walk() 方法用于通过在目录树种游走输出在目录中的文件名,向上或者向下. 2.walk( ...

  • python笔记5-python2写csv文件中文乱码问题

    前言 python2最大的坑在于中文编码问题,遇到中文报错首先加u,再各种encode.decode. 当list.tuple.dict里面有中文时,打印出来的是Unicode编码,这个是无解的. 对 ...

  • python笔记6-%u60A0和\u60a0类似unicode解码

    前言 有时候从接口的返回值里面获取到的是类似"%u4E0A%u6D77%u60A0%u60A0"这种格式的编码,不是python里面的unicode编码. python里面的uni ...

  • python笔记7-多线程threading

    前言 1.python环境2.7 2.threading模块系统自带 一. 单线程 1.平常写的代码都是按顺序挨个执行的,就好比吃火锅和哼小曲这两个行为事件,定义成两个函数,执行的时候,是先吃火锅再哼 ...