http://www.cnblogs.com/wupeiqi/articles/5040823.htmlsend
http://www.cnblogs.com/alex3714/articles/5227251.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 判断这个条件不成立就报错
作用 显示明确判断这个条件必须符合
join等待线程执行完毕
线程和进程的区别
GIL 全局解释器锁
防止原生线程同时修改一份数据,是非线程安全的(不能保证数据一致),需加锁
py调用C的原生线程,无法控制C的原声线程,启动10个原生线程,可能把数据该乱,py无法控制 那就只让一个时间一个线程修改
这个数据,真正运行的只有一个原生线程
线程可以共享数据,进程默认不能,需通过第三方管道或者队列(q)、Pipe
线程锁和GIL没有任何关系,区别:
GIL限制只有一个线程运行,解释器来回切换线程使得每个线程得到运行,
当第一个线程运行完得到结果,还没赋值给全局变量时第二个又运行了,第二个运行完把结果赋值给全局变量时
解释器又切换到了第一个线程,这时第一个线程会把为赋值的结果付回去,会冲掉第二个线程的值
GIL控制的是解释器的这块,防止解释器下面这一层的数据被改掉。线程锁是防止解释器上面的数据胡乱修改
进城之间无法通信
进程多了机器就挂,所以需要设置进程池(Pool)
callback 回调 可以把子进程的结果传给父进程