初探并发

很好,最近的一个小作业让我游行接触到真正有意义的并发编程。

Demo

于是使用python的queuesignal还有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
# -*- 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

思想

多线程的引入使得非主线程在启动后就很难控制,所以迫使人们使用消息队列这样的方式实现线程间通信。

但其实不论是否是多线程,系统各个模块本就应该将细节封装起来,而使用事件是他们协同工作,这样对于降低系统耦合有很大帮助,这也是一个好的系统的设计思想:为变化而设计。