目录python
try的工做原理是,当开始一个try语句后,python就在当前程序的上下文中做标记,这样当异常出现时就能够回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。
代码示例:服务器
while True: n1 = input('input a number: ') n2 = input('input a number: ') try: n1 = int(n1) n2 = int(n2) res = n1 + n2 print(res.sd) l = [1,2,3,4,] print(l[10]) d = {1:'a',2:'b'} print(d[3]) print('num:%s' %res) except ArithmeticError as e: #引用属性错误 print('ArithmeticError') except IndexError as e: #下标错误 print('IndexError') except KeyError as e: #key错误 print('KeyError') except ValueError as e: #引用的值错误 print('ValueError',e) except Exception as e: #抛出绝大部分的错误 print('异常错误') print(e)
经过建立一个新的异常类,程序能够命名它们本身的异常。异常应该是典型的继承自Exception类,经过直接或间接的方式。网络
#自定义异常 class DemoException(Exception): def __init__(self,msg): self.message = msg def __str__(self): return self.message a = 1 try: #若是不知足该条件,抛出异常 assert a == 1 except DemoException as e: print(e) else: print('ok') #不管是否存在异常,都执行finally finally: print('over')
socketserver 是标准库中一个高级别的模块,用于简化网络客户与服务器的实现。
一、要实现本模块,必须定义一个继承于基类BaseRequestHandler的处理程序类。BaseRequestHandler类的实例能够实现如下方法:
一、h.handle() 调用该方法执行实际的请求操做。调用该函数能够不带任何参数,可是几个实例变量包含有用的值。h.request包含请求,h.client_address包含客户端地址,h.server包含调用处理程序的实例。对TCP之类的数据流服务,h.request属性是套接字对象。对于数据报服务,它是包含收到数据的字节字符串。
2.h.setup()该方法在handle()以前调用。默认状况下,它不执行任何操做。若是但愿服务器实现更多链接设置,能够在这里实现。
3.h.finish()调用本方法能够在执行完handle()以后执行清除操做。若是setup()和 handle()都不生成异常,则无需调用该方法。
2.服务器。要使用处理程序,必须将其插入到服务器对象。定义了四个基本的服务器类。
一、TCPServer 支持ipv4的TCP协议的服务器。
二、UDPServer 支持ipv4的UDP协议的服务器。
三、UnixStreamServer 使用UNIX域套接字实现面向数据流协议的服务器,集成自TCPserver。
四、UnixDatagramServer 继承自UDPServer
四个服务器类的实例都有一下方法和变量:
一、s.socket 用于传入请求的套接字对象
二、s.server_address 监听服务器的地址
三、s.RequestHandleClass 传递给服务器构造函数并由用户提供的请求处理程序类
四、s.server_forever() 处理无线的请求
五、s.shutdown() 中止server_forever()循环
六、s.fileno() 返回服务器套接字的整数文件描述符。该方法能够有效的经过轮询操做实例
代码实例
多线程
server端 #导入该模块 import socketserver #定义一个类,继承socketserver.BaseRequestHandler class Server(socketserver.BaseRequestHandler): def handle(self): #打印客户端地址和端口 print('New connection:',self.client_address) #循环 while True: #接收客户发送的数据 data = self.request.recv(1024) if not data:break#若是接收数据为空就跳出,不然打印 print('Client data:',data.decode()) self.request.send(data)#将收到的信息再发送给客户端 if __name__ == '__main__’: host,port = '127.0.0.1’,8080 #定义服务器地址和端口 server = socketserver.ThreadingTCPServer((host,port),Server) #实现了多线程的socket通话 server.serve_forever()#不会出如今一个客户端结束后,当前服务器端就会关闭或者报错,而是继续运行,与其余的客户端继续进行通话。 client端 import socket ip_port = ('127.0.0.1',8080) sk = socket.socket() sk.connect(ip_port) while True: raw = input('>> ').strip() sk.send(bytes(raw,'utf8')) msg = sk.recv(1024) print(str(msg,'utf8')) sk.close()
一、定义
进程是具备必定独立功能的程序,关于某个数据集合上的一次运行活动。进程是系统进行资源分配和调度的一个独立单位。
线程是进程的一个实体,是CPU调度和分配的基本单位,它是比进程更小的可以独立运行的基本单位。线程不拥有系统资源,可是能够和同属一个进程的其余线程贡献进程所拥有的所有资源。
二、关系
一个线程能够建立和销毁另外一个线程;同一个进程中的多个线程之间能够并发执行。
三、最大差异在于它们是不一样的资源管理方式。进程有独立的地址空间,一个进程崩溃后,不会对其它进程产生影响,而线程只是一个进程中的不一样执行路径。线程有本身的堆栈和局部变量,但没有单独的地址空间。所以一个线程死掉等于整个进程死掉,多以多进程的程序要比多线程的程序强壮,但进程切换时耗费资源比较大。对于一些要求同事进行又要共享某些变量的并发操做,只能用线程,不能用进程。
Python threading模块
threading提供了一个比thread模块更高层的API来提供线程的并发性。这些线程并发运行并共享内存。
1、Thread的使用
目标函数能够实例化一个Thread对象,每一个Thread对象表明着一个线程,能够经过start()方法,开始运行。
有两种方式来建立线程:一种是经过继承Thread类,重写它的run方法;另外一种是建立一个threading.Thread对象,在它的初始化函数(__init__)中将可调用对象做为参数传入。并发
import threading import time def sayhi(num): print('running on nuber:%s' %num) time.sleep(3) if __name__ == '__main__': t1 = threading.Thread(target=sayhi,args=(1,)) t2 = threading.Thread(target=sayhi,args=(2,)) t1.start() t2.start() print(t1.getName()) print(t2.getName()) import threading import time def sayhi(num): print('running on nuber:%s' %num) time.sleep(3) if __name__ == '__main__’: t_list = [] for i in range(20): t = threading.Thread(target=sayhi,args=[i,]) t.start() t_list.append(t) for i in t_list: i.join() print('----done——')
threading模块中的join函数
该函数的做用主要是阻塞进程直到线程执行完毕。通用的作法是启动一批线程,最后join这些线程结束。
原理就是一次检验线程池中的线程是否结束,没有结束就阻塞知道线程结束,若是结束则跳转执行下一个线程的join函数。
endapp