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)
这里我们大致的流程是,每次有一个握手,就新建一个线程,当然,这里暂时没有涉及到结束线程以及后续处理,是最简单的模型,也是非常容易崩溃的,我们将在之后进行改良。
植入部分
如果您觉得文章不错,可以通过赞助支持我。
如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。