Python 模块(八) socketserver 以及 线程、进程
目录
- 异常处理
- socketserver
- 线程、进程
一、异常处理
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')
二、sokectserver
socketserver 是标准库中一个高级别的模块,用于简化网络客户与服务器的实现。
1、要实现本模块,必须定义一个继承于基类BaseRequestHandler的处理程序类。BaseRequestHandler类的实例可以实现以下方法:
1、h.handle() 调用该方法执行实际的请求操作。调用该函数可以不带任何参数,但是几个实例变量包含有用的值。h.request包含请求,h.client_address包含客户端地址,h.server包含调用处理程序的实例。对TCP之类的数据流服务,h.request属性是套接字对象。对于数据报服务,它是包含收到数据的字节字符串。
2.h.setup()该方法在handle()之前调用。默认情况下,它不执行任何操作。如果希望服务器实现更多连接设置,可以在这里实现。
3.h.finish()调用本方法可以在执行完handle()之后执行清除操作。如果setup()和 handle()都不生成异常,则无需调用该方法。
2.服务器。要使用处理程序,必须将其插入到服务器对象。定义了四个基本的服务器类。
1、TCPServer 支持ipv4的TCP协议的服务器。
2、UDPServer 支持ipv4的UDP协议的服务器。
3、UnixStreamServer 使用UNIX域套接字实现面向数据流协议的服务器,集成自TCPserver。
4、UnixDatagramServer 继承自UDPServer
四个服务器类的实例都有一下方法和变量:
1、s.socket 用于传入请求的套接字对象
2、s.server_address 监听服务器的地址
3、s.RequestHandleClass 传递给服务器构造函数并由用户提供的请求处理程序类
4、s.server_forever() 处理无线的请求
5、s.shutdown() 停止server_forever()循环
6、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()
三、进程和线程
1、定义
进程是具有一定独立功能的程序,关于某个数据集合上的一次运行活动。进程是系统进行资源分配和调度的一个独立单位。
线程是进程的一个实体,是CPU调度和分配的基本单位,它是比进程更小的能够独立运行的基本单位。线程不拥有系统资源,但是可以和同属一个进程的其他线程贡献进程所拥有的全部资源。
2、关系
一个线程可以创建和销毁另一个线程;同一个进程中的多个线程之间可以并发执行。
3、最大差别在于它们是不同的资源管理方式。进程有独立的地址空间,一个进程崩溃后,不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但没有单独的地址空间。因此一个线程死掉等于整个进程死掉,多以多进程的程序要比多线程的程序强壮,但进程切换时耗费资源比较大。对于一些要求同事进行又要共享某些变量的并发操作,只能用线程,不能用进程。
Python threading模块
threading提供了一个比thread模块更高层的API来提供线程的并发性。这些线程并发运行并共享内存。
一、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函数。
end
Python 模块(八) socketserver 以及 线程、进程的更多相关文章
- python模块介绍- SocketServer 网络服务框架
来源:https://my.oschina.net/u/1433482/blog/190612 摘要: SocketServer简化了网络服务器的编写.它有4个类:TCPServer,UDPServe ...
- Python:Day27 socketserver、线程
socketserver模块源码中没找到get_request()的方法,原因???? 服务器端-------------------------------------------------- i ...
- python之路 IO多路复用 线程进程初步了解
一.IO多路复用 1.客户端 #!/usr/bin/env python #-*-coding:utf-8-*- import socket sk=socket.socket() sk.connect ...
- Python 第八篇:异常处理、Socket语法、SocketServer实现多并发、进程和线程、线程锁、GIL、Event、信号量、进程间通讯
本节内容: 异常处理.Socket语法.SocketServer实现多并发.进程和线程.线程锁.GIL.Event.信号量.进程间通讯.生产者消费者模型.队列Queue.multiprocess实例 ...
- 15.python并发编程(线程--进程--协程)
一.进程:1.定义:进程最小的资源单位,本质就是一个程序在一个数据集上的一次动态执行(运行)的过程2.组成:进程一般由程序,数据集,进程控制三部分组成:(1)程序:用来描述进程要完成哪些功能以及如何完 ...
- python之线程进程协成
线程与进程 什么是线程 线程是进程一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源,但是它可与同属一个线程的 ...
- python成长之路 :线程、进程和协程
python线程 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分 ...
- python 自动化之路 day 09 进程、线程、协程篇
本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者 ...
- python运维开发(十一)----线程、进程、协程
内容目录: 线程 基本使用 线程锁 自定义线程池 进程 基本使用 进程锁 进程数据共享 进程池 协程 线程 线程使用的两种方式,一种为我们直接调用thread模块上的方法,另一种我们自定义方式 方式一 ...
随机推荐
- LuCI探究(转)
原文链接 : http://www.cnblogs.com/gnuhpc/archive/2013/08/31/3293643.html 1. 多语言 1)检查: opkg list | grep l ...
- Android开发匹配字符笔记
Windows下的回车换行符是\r\n,而Linux下的回车换行符是\n 所以,在windows下可以用\r\n,而在linux下要用\n 并且还发现在linux下(既在android上开发)需要匹配 ...
- oracle execute immediate
declare aa ,); l_cnt ); i_yr ; i_curCode ) :='001'; i_vDate date := ...
- javascript的函数相关属性和方法
作为一名前端初学者,应该坚持每天去学习,去总结 ,去复习,去接触更新鲜的事物.但是这段时间很浮躁,虽说也是在一直学习,自己能吸收的少之又少.今日在这突然冒出来,实感惭愧. 1.函数名.name 获得函 ...
- BZOJ 2752: [HAOI2012]高速公路(road)( 线段树 )
对于询问[L, R], 我们直接考虑每个p(L≤p≤R)的贡献,可以得到 然后化简一下得到 这样就可以很方便地用线段树, 维护一个p, p*vp, p*(p+1)*vp就可以了 ----------- ...
- BZOJ 2064: 分裂( 状压dp )
n1+n2次一定可以满足..然后假如之前土地集合S1的子集subs1和之后土地集合S2的子集subs2相等的话...那么就少了2个+操作...所以最后答案就是n1+n2-少掉的最多操作数, 由状压dp ...
- printf参数的问题
根据前面的某一篇的文章,可以清楚的看到:对于每一个函数,通过这个函数的[ebp+x]就可以直接访问到它调用的时候传进来的形参的值,通过[ebp-x]就可以直接访问它的局部变量. 所以printf这个函 ...
- 5.4.3 RegExp构造函数属性
RegExp构造函数包含一些属性(这些属性在其他语言中被看成是静态属性).这些属性适用于作用域中的所有正则表达式,并且基于所执行的最近一次正则表达式操作而变化.关于这些属性的另一个独特之处,就是可以通 ...
- codeforces 622E. Ants in Leaves
题目链接 给一棵有根树, 每个叶子节点上有一只蚂蚁. 在0时刻蚂蚁开始向上爬, 同一时刻, 除了根节点以外, 一个节点上面不能有2个蚂蚁. 问所有的蚂蚁都爬到根节点需要的最短时间. 因为除了根节点, ...
- JQuery 限制文本框只能输入数字和小数点
$(function(){ /*JQuery 限制文本框只能输入数字*/ $(".NumText").keyup(function(){ $(this).val($(this).v ...