Python线程间事件通知

Python事件机制

事件机制:
这是线程间最简单的通信机制:一个线程发送事件,其他线程等待事件
事件机制使用一个内部的标志,使用set方法进行使能为True,使用clear清除为false
wait方法将会阻塞当前线程知道标记为True

import queue
from random import randint
from threading import Thread
from threading import Event

class WriteThread(Thread):
    def __init__(self,queue,WEvent,REvent):
        Thread.__init__(self)
        self.queue = queue
        self.REvent = REvent
        self.WEvent = WEvent

    def run(self):
            data = [randint(1,10) for _ in range(0,5)]
            self.queue.put(data)
            print("send Read Event")
            self.REvent.set()  #--> 通知读线程可以读了
            self.WEvent.wait() #--> 等待写事件
            print("recv write Event")
            self.WEvent.clear() #-->清除写事件,以方便下次读取

class ReadThread(Thread):
    def __init__(self,queue,WEvent, REvent):
        Thread.__init__(self)
        self.queue = queue
        self.REvent = REvent
        self.WEvent = WEvent
    def run(self):
        while True:
            self.REvent.wait() #--> 等待读事件
            print("recv Read Event")
            data  = self.queue.get()
            print("read data is {0}".format(data))
            print("Send Write Event")
            self.WEvent.set()  #--> 发送写事件
            self.REvent.clear() #--> 清除读事件,以方便下次读取

q= queue.Queue()
WEvent = Event()
REvent = Event()
WThread = WriteThread( q, WEvent, REvent)
RThread = ReadThread(q, WEvent, REvent)

WThread.start()
RThread.start()

结果:

send Read Event
recv Read Event
read data is [9, 4, 8, 3, 5]
Send Write Event
recv write Event
时间: 2024-11-07 07:18:29

Python线程间事件通知的相关文章

8-3 如何线程间事件通知

一.tar包打包 import tarfile import os def FunTarFile(tfname): tf = tarfile.open(tfname,'w:gz') #open打开一个tar包,'w'打开模式为写 ':gz'压缩模式gzip for fname in os.listdir('.'): #遍历当前目录的文件 if fname.endswith('.docx'): tf.add(fname) #将此文件加入tar包 os.remove(fname) #移除此文件 tf

python线程间数据共享(示例演示)

``` import threading data_list = [] def task(arg): data_list.append(arg) print(data_list) def run(): for i in range(10): p = threading.Thread(target=task, args=(i,)) p.start() if name == 'main': run() ''' [0] [0, 1] [0, 1, 2] [0, 1, 2, 3] [0, 1, 2, 3

Python学习——Python线程

一.线程创建 1 #方法一:将要执行的方法作为参数传给Thread的构造方法 2 import threading 3 import time 4 5 def show(arg): 6 time.sleep(2) 7 print('thread' + str(arg)) 8 9 for i in range(10): 10 t = threading.Thread(target=show,args=(i,)) 11 time.sleep(2) 12 t.start() 13 14 #方法2:从T

[python] 线程简介

参考:http://www.cnblogs.com/aylin/p/5601969.html 我是搬运工,特别感谢张岩林老师! python 线程与进程简介 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. 程序是运行在系统上的具有某种功能的软件,比如说浏览器,音乐播放器等. 每次执行程序的时候,都会完成一定的功能,比如说浏览器帮我们打开网页,为了

python线程、进程、协程

进程与线程之间的定义 计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. 程序是运行在系统上的具有某种功能的软件,比如说浏览器,音乐播放器等. 每次执行程序的时候,都会完成一定的功能,比如说浏览器帮我们打开网页,为了保证其独立性,就需要一个专门的管理和控制执行程序的数据结构——进程控制块. 进程就是一个程序在一个数据集上的一次动态执行过程. 进程一般由程序.数据集.进程控制块三

Python线程event

python线程的事件用于主线程控制其他线程的执行,事件主要提供了三个方法wait.clear.set 事件处理的机制:全局定义了一个“Flag”,如果“Flag”值为 False,那么当程序执行 event.wait 方法时就会阻塞,如果“Flag”值为True,那么event.wait 方法时便不再阻塞. clear:将“Flag”设置为False set:将“Flag”设置为True 用 threading.Event 实现线程间通信使用threading.Event可以使一个线程等待其他

Python线程、进程知识整理

一.python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/env python # -*- coding:utf-8 -*- import threading import time   def show(arg):     time.sleep(1)     print 'thread'+str(arg)   for i in range(10):     t = t

Java 多线程 :入门(2)- 线程间协作:挂起当前线程(wait)与通知其他线程继续执行(notify\ notifyAll)

首先,之前我理解起来比较混沌的是到底谁是‘锁’这个问题,因为线程间协作的核心就是锁的交换,通过每个线程的“获得锁”与“释放锁”来实现. 锁,也叫“互斥”,是一种机制,通过控制一个对象在一定代码段(或方法内)同时只能被一个线程所访问,来实现所谓的(对于这个特定对象的)“线程安全”. 1.先看一个从网上扒来的最基本款示例,原文 http://www.cnphp6.com/archives/62258,写的很棒很清晰,我这里略微改了一两句: public class TestNotifyByFlag

java并发编程(十一)线程间的通信notify通知的遗漏

notify通知的遗漏很容易理解,即threadA还没开始wait的时候,threadB已经notify了,这样,threadB通知是没有任何响应的,当threadB退出synchronized代码块后,threadA再开始wait,便会一直阻塞等待,直到被别的线程打断. 实例见 :https://git.oschina.net/wenjieyatou/threadTest 在threadB进行通知之前,先将okToProceed置为true,这样如果threadA将通知遗漏,那么就不会进入wh