Events
Python提供了Event对象用于线程间通信,它是由线程设置的信号标志,如果信号标志位真,则其他线程等待直到信号接触。
Event对象实现了简单的线程通信机制,它提供了设置信号,清除信号,等待等用于实现线程间的通信。
event = threading.Event() 创建一个event
1 设置信号
event.set()
使用Event的set()方法可以设置Event对象内部的信号标志为真。Event对象提供了isSet()方法来判断其内部信号标志的状态。
当使用event对象的set()方法后,isSet()方法返回真
2 清除信号
event.clear()
使用Event对象的clear()方法可以清除Event对象内部的信号标志,即将其设为假,当使用Event的clear方法后,isSet()方法返回假
3 等待
event.wait()
Event对象wait的方法只有在内部信号为真的时候才会很快的执行并完成返回。当Event对象的内部信号标志位假时,
则wait方法一直等待到其为真时才返回。也就是说必须set新号标志位真
# coding=utf-8
import threading
import socket
import time
class CServer(threading.Thread):
def __init__(self, name, lock):
threading.Thread.__init__(self)
self.mName = name
self.mLock = lock
self.mEvent = threading.Event()
def run(self):
count = 0
while(True):
self.mEvent.wait()
self.mLock.acquire()
count += 1
print("CServer::{} count{}".format(self.mName, count))
self.mLock.release()
time.sleep(3)
def pause(self):
self.mEvent.clear()
def resume(self):
self.mEvent.set()
if __name__ == "__main__":
# s = socket.socket()
# host = socket.gethostname()
# print("host = {}".format(host))
# port = 9090
# s.bind((host, port))
# s.listen(5)
ts = []
lock = threading.Lock()
for i in range(1, 4):
t = CServer("id{}".format(i), lock)
t.start()
t.pause()
ts.append(t)
while True:
line = input("输入:")
if (line.lower() == "pause"):
print("暂停")
for t in ts:
t.pause()
elif (line.lower() == "run"):
print("开始")
for t in ts:
t.resume()