前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python|多进程的事件Event

Python|多进程的事件Event

作者头像
用户1278550
发布2019-08-12 15:40:36
5.2K0
发布2019-08-12 15:40:36
举报
文章被收录于专栏:idbaidba

一 前言

我们知道Python中多进程是相互执行互不干扰的,但是如果多进程之间需要对同一资源对象进行操作或者多个进程之间有相互依赖的,那就需要一个共享变量供多进程使用。Python multiprocessing 多进程之间相互协调的方式有如下几种: Lock:锁,Queue:队列, Semaphore:信号量 ,Event:事件,Pipe:管道 。

后续文章会逐个介绍这几种方式,本文学习 Event 。

二 事件Event

2.1 event是什么

Python 多进程中 Event 是用来实现进程间同步通信的(当然多线程中也可以用 event )。事件event运行的机制是:全局定义了一个Flag,如果Flag值为 False,当程序执行event.wait()方法时就会阻塞,如果Flag值为True时,程序执行event.wait()方法时不会阻塞继续执行。

Python线程的事件提供如下几个方法

代码语言:javascript
复制
wait()方法:wait是否阻塞是看event对象内部的Flag的值。
set()方法:将Flag的值改成True。
clear()方法:将Flag的值改成False。
is_set()方法:判断当前的Flag的值。
2.2 如何用 event()

代码中我们可以通过

e = Event() 或者 e = multiprocessing.Event()

创建一个全局的event对象,用于不同进程之间的通信。

举个?, 大家过马路都要经过红绿灯, 行人过马路交通指示灯是两个不同的对象或者处理单元。我们可以把行人和红绿灯抽象为两个独立的进程行人在绿灯的情况下通过马路,红灯时必须等待。红绿灯可以当做两个进程的通信机制event。

代码语言:javascript
复制
# encoding: utf-8
"""
import time
import random
from multiprocessing import Process
from multiprocessing import Event

def now():
    return str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))


def traffic_light(e):  # 红绿灯
    print now() + ' \033[31m红灯亮\033[0m'  # Flag 默认是False
    while True:
        if e.is_set():  # 如果是绿灯
            time.sleep(2)  # 2秒后
            print now() + ' \033[31m红灯亮\033[0m'  # 转为红灯
            e.clear()  # 设置为False

        else:  # 如果是红灯
            time.sleep(2)  # 2秒后
            print now() + ' \033[32m绿灯亮\033[0m'  # 转为绿灯
            e.set()  # 设置为True

def people(e, i):
    if not e.is_set():
        print now() + ' people %s 在等待' % i
        e.wait()
    print   now() +' people %s 通过了' % i


if __name__ == '__main__':
    e = Event()  # 默认为 False,红灯亮
    p = Process(target=traffic_light, args=(e,))  # 红绿灯进程
    p.daemon = True
    p.start()
    process_list = []
    for i in range(6):  # 6人过马路
        time.sleep(random.randrange(0, 4, 2))
        p = Process(target=people, args=(e, i))
        p.start()
        process_list.append(p)

    for p in process_list:
        p.join()

执行结果如下:

三 小结

我们在多线程 和多进程中都可以利用event机制,进行子线程之间或者主进程和子线程之间的沟通协调机制。

-The End-


本公众号长期关注于数据库技术以及性能优化,故障案例分析,数据库运维技术知识分享,个人成长和自我管理等主题,欢迎扫码关注。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yangyidba 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二 事件Event
    • 2.1 event是什么
      • 2.2 如何用 event()
      • 三 小结
      相关产品与服务
      数据库
      云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档