CodeSky 代码之空

随手记录自己的学习过程

Python 从多人聊天室开始谈系列 - 多线程

2016-04-09 13:34分类: Python评论: 0

完成了上一个版本,我们会发现,根本聊不起来啊!

问题的关键在于,我们现在的程序,一次只能干一个事情,你让我等待输入了,我就不能好好输出了。

所以我们需要在此引入多线程的概念,多线程的概念,简单的来说,就是,我因为只有一个人,你让我去干一件事还可以,两件事我不行,那多加一个人,总可以干了。

那么阻塞呢,意思就是说:由于我干了这个,不能干那个,我们把这个现象叫做阻塞。

概念都理解了之后,我们知道了,只要多加一个线程就行了!

实现多线程有几种方法,具体来说,我们可以看一下这篇: http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944771.html

这个基本上和Java的差不多,Java是两种方法,一种继承类,一种继承接口。两种方法都可以,但又有所不同,Python中,我们使用threading,可扩展性更好。

基本步骤是:

1scanner = scanThread() # 创建
2
scanner.start() # 启动
3

问题不大,在线程内部作出处理也很简单,我们简单分成接受和发送两个线程。Server与Client相同,这里就不贴完整代码了,以Server为例。

……以下在拷贝过来的时候缩进好像有点乱,发现无法运行的情况大家自行纠正以下……

1class scanThread(threading.Thread):

2    def __init__(self):

3            threading.Thread.__init__(self)


4                def run(self):

5                        while True:

6                                    c, addr = s.accept()
7                                    
            lists.append({'client': c, 'address': addr})

8                                                receiveThread(c, addr).start()
9print lists
10print 'Got connection from', addr
11                                                
            c.send('Thank you for connecting')


12class receiveThread(threading.Thread):

13    def __init__(self, client, address):

14            threading.Thread.__init__(self)

15                    self.client = client

16                            self.address = address


17                                def run(self):

18                                        while True:

19                                                    msg = self.client.recv(1024)

20                                                                if msg:

21                                                                        print msg
22for receiver in lists:
23if receiver['address'] != self.address:
24
                        receiver['client'].sendall(msg)
25

这里我们大致的流程是,每次有一个握手,就新建一个线程,当然,这里暂时没有涉及到结束线程以及后续处理,是最简单的模型,也是非常容易崩溃的,我们将在之后进行改良。

评论 (0)