day8 socket socketserver 异常 断言
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了day8 socket socketserver 异常 断言相关的知识,希望对你有一定的参考价值。
http://www.cnblogs.com/wupeiqi/articles/5040823.htmlsend
http://www.cnblogs.com/alex3714/articles/5227251.html
http://www.cnblogs.com/Keep-Ambition/p/7596098.html
sendall不断调用send ,一次性发送过去,传大文件不合适
SocketServer 通过多线程的方式处理
部分代码
# _*_ coding:utf8 _*_ import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): #为什么是BaseRequestHandler,见alex博客,它下又分其他的东西 #必须有handle方法 def handle(self): #所有跟客户端的交互都是在这里的 #pass print("New Conn:", self.client_address) #打印客户端的地址 data = self.request.recv(1024) print("Client Says:",data.decode()) self.request.send(data) if __name__ == "__main__": HOST, PORT = "localhost", 50007 #把刚才写的类当作一个参数传发给ThreadingTCPServer这个类,下面的代码就创建了一个事例 server = socketserver.ThreadingTCPServer((HOST, PORT),MyTCPHandler) #启动这个server,这个server会一直运行,除非ctrl+c停止 server.serve_forever()
加上while True可实现的效果多个客户端可以连接,多并发的。客户端还是之前的那段代码几乎不变
异常处理
try:
pass
except
finally
无论是否出错都执行
else
没有出一场就执行
自己出发异常 raise
Exception 万能异常
自定义异常
一些业务逻辑无法满足需自己定义异常
http://www.cnblogs.com/wupeiqi/articles/5017742.html
class WupeiqiException(Exception): def __init__(self, msg): self.message = msg def __str__(self): return self.message try: raise WupeiqiException(\'我的异常\') except WupeiqiException,e: print e
断言
assert 判断这个条件不成立就报错
作用 显示明确判断这个条件必须符合
http://www.cnblogs.com/Keep-Ambition/p/7596098.html
join等待线程执行完毕
线程和进程的区别
GIL 全局解释器锁
防止原生线程同时修改一份数据,是非线程安全的(不能保证数据一致),需加锁
py调用C的原生线程,无法控制C的原声线程,启动10个原生线程,可能把数据该乱,py无法控制 那就只让一个时间一个线程修改
这个数据,真正运行的只有一个原生线程
线程可以共享数据,进程默认不能,需通过第三方管道或者队列(q)、Pipe
线程锁和GIL没有任何关系,区别:
GIL限制只有一个线程运行,解释器来回切换线程使得每个线程得到运行,
当第一个线程运行完得到结果,还没赋值给全局变量时第二个又运行了,第二个运行完把结果赋值给全局变量时
解释器又切换到了第一个线程,这时第一个线程会把为赋值的结果付回去,会冲掉第二个线程的值
GIL控制的是解释器的这块,防止解释器下面这一层的数据被改掉。线程锁是防止解释器上面的数据胡乱修改
进城之间无法通信
进程多了机器就挂,所以需要设置进程池(Pool)
callback 回调 可以把子进程的结果传给父进程
多线程例子
#!/usr/bin/env python #_*_coding:utf-8_*_ #__author__="lihongxing" import threading import time def sayhi(num): print("runninig on number:%s"%(num)) time.sleep(3) if __name__=="__main__": \'\'\' #(1,)加逗号的意思就是说他是个元组类型,一个参数不叫逗号会认为是数字 t1 = threading.Thread(target=sayhi,args=(1,)) t2 = threading.Thread(target=sayhi,args=(2,)) t1.start() t2.start() \'\'\' t_list = [] for i in range(10): t = threading.Thread(target=sayhi,args=[i,]) t.start() t_list.append(t) for i in t_list: i.join() #join等待所有线程执行完毕 再去执行主线程的done print("----done-----")
第二种写法
#!/usr/bin/env python #_*_coding:utf-8_*_ #__author__="lihongxing" import threading,time class MyThread(threading.Thread): def __init__(self,num): threading.Thread.__init__(self) self.num = num def run(self): print("running number is %s" %self.num) time.sleep(3) if __name__ == "__main__": t1 = MyThread(1) t2 = MyThread(2) t1.start() t2.start()
以上是关于day8 socket socketserver 异常 断言的主要内容,如果未能解决你的问题,请参考以下文章