线程间通信(一)

来源:互联网 发布:矩阵分解模型 编辑:程序博客网 时间:2024/05/17 01:26

 

Python提供了Event对象用于线程间的相互通信。实际上线程同步在一定程度上已经实现线程间的通信。线程同步是每次仅有一个线程对共享数据进行操作,其他线程则等待。而Event对象是由线程设置的信号标志,如果信号标志为真,则其他线程等待直到信号解除。

9.3.1  Event对象的方法

Event对象实现了简单的线程通信机制,它提供了设置信号、清除信号、等待等用于实现线程间的通信。

1.设置信号

使用Event对象的set()方法可以设置Event对象内部的信号标志为真。Event对象提供了isSet()方法来判断其内部信号标志的状态。当使用Event对象的set()方法后,isSet()方法返回真。

2.清除信号

使用Event对象的clear()方法可以清除Event对象内部的信号标志,即将其设置为假。当使用Event对象的clear()方法后,isSet()方法返回假。

3.等待

Event对象wait的wait方法只有在其内部信号为真时才会很快地执行完成并返回。当Event对象的内部信号标志为假时,则wait方法一直等到其为真时才返回。另外还可以向wait方法传递参数,以设定最长等待时间。

9.3.2  使用Event对象实现线程间通信

配合使用Event对象的几种方法可以实现进程间的简单通信。以下的event.py脚本即使用Event对象实现进程间的通信。

    # -*- coding:utf-8 -*-
# file: event.py
#
import threading          # 导入threading模块
class mythread(threading.Thread):
def _init_(self,threadname):
threading.Thread._init_(self,name = threadname)
def run(self):
global event         # 使用全局Event对象
if event.isSet():        # 判断Event对象内部信号标志
event.clear()        # 若已设置标志则清除
event.wait()        # 调用wait方法
print self.getName()
else:
print self.getName()
event.set()        # 设置Event对象内部信号标志
event = threading.Event()       # 生成Event对象
event.set()           # 设置Event对象内部信号标志
tl = []
for i in range(10):
t = mythread(str(i))
tl.append(t)          # 生成线程列表

for i in tl:
i.start() 
# 运行线程

运行脚本后输出如下所示。

  

1
0
3
2
5
4
7
6
9
8