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

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

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

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

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

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

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

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

基本步骤是:

scanner = scanThread() # 创建

scanner.start() # 启动

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

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

class scanThread(threading.Thread):

    def __init__(self):

            threading.Thread.__init__(self)


                def run(self):

                        while True:

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

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


class receiveThread(threading.Thread):

    def __init__(self, client, address):

            threading.Thread.__init__(self)

                    self.client = client

                            self.address = address


                                def run(self):

                                        while True:

                                                    msg = self.client.recv(1024)

                                                                if msg:

                                                                        print msg

                for receiver in lists:

                    if receiver['address'] != self.address:

                        receiver['client'].sendall(msg)

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

植入部分

如果您觉得文章不错,可以通过赞助支持我。

如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。

标签: 成品, 源码, 知识, 代码段, 语法

添加新评论