很好,最近的一个小作业让我游行接触到真正有意义的并发编程。
Demo
于是使用python的queue
和signal
还有time
模块做了一个不算真正多线程的示意用的小小demo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
import signal import queue import time
class TestClass(object): queue = queue.Queue()
def __init__(self): signal.signal(signal.SIGINT, self.stopIfPressKill)
def stopIfPressKill(self, mySignal, stack): if mySignal == signal.SIGINT: print('you pressed CTRL-C') self.queue.put_nowait('stop') print(self.queue.qsize())
def mainThread(self): while True: time.sleep(1) if not self.queue.empty(): data = self.queue.get() print(data) if data == 'stop': break else: self.queue.put(data)
if __name__ == '__main__': yoo = TestClass() yoo.mainThread()
|
解释一下三个模块的作用:
queue
:作为消息队列,这里显然有点大材小用。
signal
:用来捕捉KeyboardInterrupt
之后将停止信号置入消息队列。
time
:用来让主线程能够捕捉到这个KeyboardInterrupt
。
思想
多线程的引入使得非主线程在启动后就很难控制,所以迫使人们使用消息队列这样的方式实现线程间通信。
但其实不论是否是多线程,系统各个模块本就应该将细节封装起来,而使用事件是他们协同工作,这样对于降低系统耦合有很大帮助,这也是一个好的系统的设计思想:为变化而设计。