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

时间: 2024-10-15 05:53:43

Python 模块(八) socketserver 以及 线程、进程的相关文章

python模块介绍- SocketServer 网络服务框架

来源:https://my.oschina.net/u/1433482/blog/190612 摘要: SocketServer简化了网络服务器的编写.它有4个类:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer.这4个类是同步进行处理的,另外通过ForkingMixIn和ThreadingMixIn类来支持异步. 创建服务器的步骤.首先,你必须创建一个请求处理类,它是BaseRequestHandler的子类并重载其handle()

python之路 IO多路复用 线程进程初步了解

一.IO多路复用 1.客户端 #!/usr/bin/env python #-*-coding:utf-8-*- import socket sk=socket.socket() sk.connect(('127.0.0.1',8888,)) data=sk.recv(1024) print(data) while True: inp=input('>>>') sk.sendall(bytes(inp,encoding='utf-8')) print(sk.recv(1024)) sk.

15.python并发编程(线程--进程--协程)

一.进程:1.定义:进程最小的资源单位,本质就是一个程序在一个数据集上的一次动态执行(运行)的过程2.组成:进程一般由程序,数据集,进程控制三部分组成:(1)程序:用来描述进程要完成哪些功能以及如何完成(2)数据集:是程序在执行过程中所需要使用的一切资源(3)进程控制块:用来记录进程外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志.3.进程的作用:是想完成多任务并发,进程之间的内存地址是相互独立的二.线程:1.定义:最小的执行单位,线程的出现是为了

Python(线程进程2)

二 threading模块 ''' 进程包括多个线程,线程之间切换的开销远小于进程之间切换的开销 线程一定是寄托于进程而存在的 进程:最小的资源管理单元 线程:最小的执行单元 python锁的机制,一个进程一把锁,一个进程一个时间只能取出一个线程,所以无法实现真正的进程中的线程并行 I/O密集型任务 计算密集型任务 ''' 2.1 线程对象的创建 2.1.1 Thread类直接创建 import threading import time def countNum(n): # 定义某个线程要运行

【python进阶】并发编程-线程与进程

并发编程-进程与线程 什么是进程(process)? 进程(process),是计算机中已运行程序的实体,是线程的容器:一个进程至少有一个线程 假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源.是不是在程序A读取数据的过程中,让程序B去执行,当程序A读取完数据之后,让 程序B暂停,然后让程序A继续执行?当然没问题,但这里有一个关键词:切换既然是切换,那么这就涉及到了状态的保存

python 自动化之路 day 09 进程、线程、协程篇

本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queue队列 开发一个线程池 进程 语法 进程间通讯 进程池

Python的线程&进程&协程[0] -> 线程 -> 多线程的建立与使用

常用的多线程功能实现 目录 生成线程的三种方法 单线程与多线程对比 守护线程的设置 1 生成线程的三种方法 三种方式分别为: 创建一个Thread实例,传给它一个函数 创建一个Thread实例,传给它一个可调用的类实例 派生Thread的子类,并创建子类的实例 # There are three ways to create a thread # The first is create a thread instance, and pass a function # The second one

第八篇 Python 模块与包

一.模块介绍 什么是模块? 常见的场景:一个模块就是一个包含了一组功能的Python文件,比如spam.py,模块名为spam,可以通过import spam使用. 在Python中,模块的使用方式都是一样的,但其实细说的,模块可以分为四个通过类别: 1.使用Python编写的.py文件 2.已被编译为共享库或DLL的C或C++扩展 3.把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包) 4.使用C编写并链接到Python解释器的内置模块 为何要使用

Python 八、Python模块

一.python文件概述 1.python模块概述 可以将代码量较大的程序分割成多个有组织的.彼此独立但又能互相交互的代码片段,这些自我包含的有组织的代码段就是模块 模块在物理形势上表现为以.py结尾的代码文件 一个文件被看作一个独立的模块,一个模块也可以被看作是一个文件 模块的文件名就是模块的名字加上扩展名(.py) 每个模块都有自己的名称空间 python允许导入其它模块以实现代码重用,从而也实现了将独立的代码文件组织成更大的程序系统 python中,模块也是对象 在一个模块的顶层定义的所有