../chu-tan-bing-fa
By 0xc1初探并发
很好,最近的一个小作业让我游行接触到真正有意义的并发编程。
Demo
于是使用 python 的queue
和signal
还有time
模块做了一个不算真正多线程的示意用的小小 demo:
# -*- coding: utf-8 -*-
# @Author: Michale
# @Date: 2017-05-04 15:00:41
# @Last Modified by: Michale
# @Last Modified time: 2017-05-07 00:46:52
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
。
思想
多线程的引入使得非主线程在启动后就很难控制,所以迫使人们使用消息队列这样的方式实现线程间通信。
但其实不论是否是多线程,系统各个模块本就应该将细节封装起来,而使用事件是他们协同工作,这样对于降低系统耦合有很大帮助,这也是一个好的系统的设计思想:为变化而设计。