http://www.cnblogs.com/holbrook/archive/2012/02/23/2365420.html
"""
python多线程编程(7):线程间通信
很多时候,线程之间会有互相通信的需要。常见的情形是次要线程为主要线程执行特定的任务,在执行过程中需要不断报告执行的进度情况。前面的条件变量同步已经涉及到了线程间的通信(threading.Condition的notify方法)。更通用的方式是使用threading.Event对象。
threading.Event可以使一个线程等待其他线程的通知。其内置了一个标志,初始值为False。线程通过wait()方法进入等待状态,直到另一个线程调用set()方法将内置标志设置为True时,Event通知所有等待状态的线程恢复运行。还可以通过isSet()方法查询Envent对象内置状态的当前值。
import threading
import random
import time
class MyThread(threading.Thread):
def __init__(self, threadName, event):
threading.Thread.__init__(self,name=threadName)
self.threadEvent=event
def run(self):
print '%s is ready'%self.name
self.threadEvent.wait()
print '%s run!' %self.name
sinal=threading.Event()
sinal.set()
for i in range(10):
t=MyThread(str(i),sinal)
t.start()
sinal.set()
"""
"""python的Thread类中还提供了join()方法,使得一个线程可以等待另一个线程执行结束后再继续运行。这个方法还可以设定一个timeout参数,避免无休止的等待。因为两个线程顺序完成,看起来象一个线程,所以称为线程的合并.对于sleep时间过长的线程,将不被等待。
import threading
import random
import time
class MyThread(threading.Thread):
def run(self):
wait_time=random.randrange(1,10)
print '%s will wait %d seconds'%(self.name,wait_time)
time.sleep(wait_time)
print '%s wakes up!' %self.name
if __name__=='__main__':
threads=[]
for i in range(5):
t=MyThread()
t.start()
threads.append(t)
print 'main thread is waiting for exit...'
for t in threads:
t.join(1)
print 'main thread finished!'
后台线程
默认情况下,主线程在退出时会等待所有子线程的结束。如果希望主线程不等待子线程,而是在退出时自动结束所有的子线程,就需要设置子线程为后台线程(daemon)。方法是通过调用线程类的setDaemon()方法。如下:
import threading
import random
import time
class MyThread(threading.Thread):
def run(self):
wait_time=random.randrange(1,10)
print '%s will wait %d seconds'%(self.name,wait_time)
time.sleep(wait_time)
print '%s finished!' %self.name
if __name__=='__main__':
print 'main thread is waitting for exit.....'
for i in range(5):
t=MyThread()
t.setDaemon(True)
t.start()
print 'main thread finished!'
"""
"""
python多线程编程(6): 队列同步
前面介绍了互斥锁和条件变量解决线程间的同步问题,并使用条件变量同步机制解决了生产者与消费者问题。
让我们考虑更复杂的一种场景:产品是各不相同的。这时只记录一个数量就不够了,还需要记录每个产品的细节。很容易想到需要用一个容器将这些产品记录下来。
Python的Queue模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。
用FIFO队列实现上述生产者与消费者问题的代码如下:
import threading
import time
from Queue import Queue
class Producer(threading.Thread):
def run(self):
global queue
count=0
while True:
for i in range(100):
if queue.qsize()>1000:
pass
else:
count=count+1
msg='produce '+str(count)
queue.put(msg)
print msg
time.sleep(1)
class Consumer(threading.Thread):
def run(self):
global queue
while True:
for i in range(3):
if queue.qsize()<100:
pass
else:
msg=self.name+'consume '+ queue.get()
print msg
time.sleep(1)
queue=Queue()
def test():
for i in range(500):
queue.put('product '+ str(i))
print 'finished'
for i in range(2):
p=Producer()
p.start()
for i in range(5):
c=Consumer()
c.start()
if __name__=='__main__':
test()
"""
分享到:
相关推荐
使用`Thread`类可以创建新线程,`start()`方法启动线程,`join()`方法等待线程完成。 2. **多进程**:multiprocessing模块则提供了类似线程的多进程支持。每个进程拥有独立的内存空间,这使得它们之间数据隔离,但...
### Python入门教程:高效掌握Python的核心知识点 #### 一、Python简介及应用场景 **Python**是一种高级编程语言,以其简洁的语法和强大的功能受到广大开发者的喜爱。它不仅适用于新手学习,也是专业开发者构建...
Python提供多种IPC方法,如管道(Pipe)、套接字(Socket)、消息队列(Message Queue)等。PyQt5也提供了QProcess类,可以用来启动、控制外部程序并与其交换数据。"py-communicate-final"项目可能就利用了QProcess...
Fenner relies on plain-English stories, pictures, and Python examples to communicate the ideas of machine learning. Mark begins by discussing machine learning and what it can do; introducing key ...
Inside, you will see how intuitive and flexible it is to discover and communicate meaningful patterns of data using Python scripts, reporting systems, and data export. This book examines how to go ...
Inside, you will see how intuitive and flexible it is to discover and communicate meaningful patterns of data using Python scripts, reporting systems, and data export. This book examines how to go ...
【标题】:hsl-communicate通讯技术:实现PC与三菱PLC的高效连接 【内容】: 在工业自动化领域,通信技术是连接不同设备、系统的关键,使得数据交换成为可能。hsl-communicate是一个专门针对PC与三菱PLC(可编程...
Perl Best Practices author Damian Conway explains that rules, conventions, standards, and practices not only help programmers communicate and coordinate with one another, they also provide a reliable...
### Python 入门详细教程-1天学会 Python #### 一、引言 本文档旨在为初学者提供一份详尽的Python入门指南,通过一天的学习,帮助读者掌握Python的基础知识和基本技能。Python是一种广泛使用的高级编程语言,以其...
### Python 捕获Shell脚本的输出结果实例详解 在日常开发工作中,有时我们需要让Python脚本调用外部的Shell命令并获取其输出结果。本文将详细介绍如何使用Python来捕获Shell脚本的输出结果,并通过几个示例进行演示...
本程序 本应由TC3.0 编译环境下 完成 DOS的串行通信程序(简单)
5. **交流管理模块** (Communication Management Module): Provides a platform for users to communicate with each other, ask questions, share notes, or form study groups, fostering a collaborative ...
#### 2.4 消息队列(Message Queue) 消息队列允许进程间传递结构化数据。每个消息都有唯一的标识符,进程可以选择发送或接收特定的消息。 #### 2.5 共享内存(Shared Memory) 共享内存允许进程直接访问同一块...
在Python编程中,子进程管理是一个重要的领域,特别是在执行外部命令、系统操作或者需要与操作系统交互时。"Subprocesses for Humans 2.0"是一个针对Python子进程管理的库,旨在提供更易于理解和使用的接口,使...
本文将深入探讨"communicate_java_通信_"这个主题,讲解如何使用Java进行通信,以及如何实现一个基本的类似QQ的通信软件。 首先,我们需要理解Java中的网络编程基础。Java通过Socket编程提供了TCP/IP协议的支持,...
本知识点将深入探讨四个表示“联合”或“连接”的动词:combine、connect、join 和 unite,以及另外两个常用的动词 complete 和 finish,以及动词 communicate 的不同用法。 首先,我们来看 combine、connect、join...