Python 多线程 Event

首先需要明确一下进程和线程的概念。

进程(有时被称为重量级进程)是程序的一次执行。每个进程都有自己的地址空间、内存、数据宅及其他记录其运行轨迹的辅助数据。操作系统管理在其运行的所有进程,并为这些进程公平的分配时间,进程也可以通过fork和spawn操作来完成其他的任务。

线程(有时被称为轻量级进程)跟进程有些相似。不同的是,所有的线程运行在同一个进程中,共享相同的运行环境,我们可以想象成在主进程或者主线程运行中运行的迷你进程。一个进程中有多个线程共享通过一片数据空间,所以线程之间可以比进程之间更方便的共享数据及相互通信。

线程一般都是并发执行的,也就是因为这种并行和数据共享的机制使得多个任务的合作变的可能。但是,在但CPU得系统中,做到真正的并行是不可能的,每个线程会被安排成每次只运行一小会儿,然后将CPU让出来,让其他线程执行,在进程的整个运行过程中,每个线程都只做自己的事,在需要的时候跟其他的线程共享运行的结果。

同时在共享数据的时候注意竞态条件等问题。


在Python中提供给我们两个用于多线程编程的模块:Thread模块和Threading模块

不过我们建议使用Threading模块,原因是,Threading模块更高级别,更高级别的Threading模块更为先进。对于线程的支持更为先进,同时,使用Thread模块里面的属性有可能会与Threading模块出现冲突,其次,低级别的Thread模块的同步原语很少,Threading模块确有很多。

不建议使用Thread模块的另一个原因是,Thread模块不支持守护线程。当主线程 退出时,所有的子线程不论他们是否还在工作,都会被强行退出。

但是Threading模块支持守护线程,具体工作方式:守护线程一般是一个等待客户请求服务器,如果没有客户提出请求,它就在那里等着。如果设定一个线程为守护线程,那么就是默认这个线程是不重要的,在进程退出的时候不用等待这个线程退出。


在Threading模块中支持多线程的方法有:Lock方法、RLock方法、Condition方法、Event方法。其中最简单的当属Event方法。下面我就主要介绍Event方法。

Event实现与Condition类似的功能,不过比Condition简单一点。它通过维护内部的标识符来实现线程间的同步问题。(threading.Event和.NET中的System.Threading.ManualResetEvent类实现同样的功能。)

Event.wait()

Event对象的wait的方法只有内部信号为真的时候才会很快的执行并完成返回。当Event对象的内部信号标识为假时,则wait方法一直等待其为真时才返回。同时可以对wait设置timeout,当达到timeout设置的时间的时候就可以完成返回或执行。

Event.set()

  将标识位设为Ture

Event.clear()

  将标识伴设为False。

Event.isSet()

  判断标识位是否为Ture。

下面用一个通信示意图表示:

Python 多线程 Event_第1张图片

下面是一个例子:

这是一个捉迷藏的游戏,可以很好的诠释Event.set(),Event.wait()的使用情况

#-*-coding:utf-8-*-
#/home/simon


import threading
import time


class Hider(threading.Thread):
        def __init__(self, cond, name):
                super(Hider, self).__init__()
                self.cond = cond
                self.name = name


        def run(self):
            while True:


                self.cond.set()
                #time.sleep(1)
                #self.cond.wait()
                print self.name + ': A1 '
                time.sleep(5)
                self.cond.wait()
                #time.sleep(1)
                self.cond.set()
                print self.name + ': A2 '
                time.sleep(5)
                self.cond.wait()
                self.cond.set()
                print self.name + ': A3'
                time.sleep(5)
                self.cond.wait()


class Seeker(threading.Thread):
        def __init__(self, cond, name):
                super(Seeker, self).__init__()
                self.cond = cond
                self.name = name


        def run(self):
            while True:


                #self.cond.wait()
                self.cond.set()
                print self.name + ': B1 '
                #self.cond.set()
                time.sleep(5)
                self.cond.wait()
                self.cond.set()


                print self.name + ': B2'
                time.sleep(5)
                self.cond.wait()
                self.cond.set()
                print self.name + ': B3'
                time.sleep(5)
                self.cond.wait()


cond = threading.Event()
seeker = Seeker(cond, 'seeker')
hider = Hider(cond, 'hider')


seeker.start()
hider.start()

输出如下:

Python 多线程 Event_第2张图片

估计有些没有讲的很详细,如果感兴趣的朋友可以留言,共同交流



你可能感兴趣的:(Python编程)