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 异常 断言的主要内容,如果未能解决你的问题,请参考以下文章

day8--socketserver回顾

Day8 - Socket网络编程

Python-socket网络编程-Day8

day8--socketserver

操作 python基础学习日志day8-socketserver

day8--socketserver作业