单线程之间的并发就是利用一个线程实现并发的效果,也就是利用了cup遇到阻塞的那段时间去做别的事情,从而提高了cup的利用率,使之在单个线程中就实现了并发的效果。

下面就是一个简单的服务端单个线程实现并发的代码:

  1. from socket import *
  2. server=socket(AF_INET,SOCK_STREAM)
  3. server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)#地址重用
  4. server.bind(('127.0.0.1',8082)) #绑定端口
  5. server.listen(5)#监听
  6. server.setblocking(False)#关闭IO阻塞
  7. print('Starting......')
  8. conn_l=[]
  9. del_l=[]
  10. while True:
  11. try:
  12. conn,addr=server.accept()#建立连接
  13. print('%s 已连接'%addr[0])
  14. conn_l.append(conn)
  15. except BlockingIOError:#捕捉IO阻塞异常
  16. for conn in conn_l:
  17. try:
  18. data=conn.recv(1024)#接受数据
  19. conn.send(data.upper())
  20. except BlockingIOError:
  21. pass
  22. except ConnectionResetError:#捕捉主机强行断开异常
  23. del_l.append(conn) #存到列表准备删除断开的连接
  24. for obj in del_l:
  25. obj.close() #关闭连接
  26. conn_l.remove(obj) #删除连接
  27. del_l=[] #清空

很明显,这种方式太麻烦,要自己捕获异常的信号去进行相应的处理。

这个时候就应该想到python模块了,没错selete这个模块就可以做这些捕捉信息的功能。

下面就用selete模块来写上面那些代码吧:

  1. from socket import *
  2. import select
  3. server=socket(AF_INET,SOCK_STREAM)
  4. server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
  5. server.bind(('127.0.0.1',8082))
  6. server.listen(5)
  7. server.setblocking(False)
  8. print('Starting......')
  9. read_l=[server,]
  10. while True:
  11. s,_,_=select.select(read_l,[],[])
  12. for obj in s :
  13. if obj == server:
  14. conn, addr = obj.accept()
  15. read_l.append(conn)
  16. else:
  17. try:
  18. data=obj.recv(1024)
  19. obj.send(data.upper())
  20. except ConnectionResetError:
  21. pass

很明显,要比上面代码精简好多,这就是Python模块的好处了,哈哈 ....

python网络编程之单线程之间的并发的更多相关文章

  1. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...

  2. python网络编程——IO多路复用之select

    1 IO多路复用的概念 原生socket客户端在与服务端建立连接时,即服务端调用accept方法时是阻塞的,同时服务端和客户端在收发数据(调用recv.send.sendall)时也是阻塞的.原生so ...

  3. 图解Python网络编程

    返回目录 本篇索引 (1)基本原理 (2)socket模块 (3)select模块 (4)asyncore模块 (5)asynchat模块 (6)socketserver模块 (1)基本原理 本篇指的 ...

  4. python网络编程-01

    python网络编程 1.socket模块介绍 ①在网络编程中的一个基本组件就是套接字(socket),socket是两个程序之间的“信息通道”. ②套接字包括两个部分:服务器套接字.客户机套接字 ③ ...

  5. python 网络编程 TCP/IP socket UDP

    TCP/IP简介 虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多. 计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM.Apple和Micro ...

  6. python 网络编程 IO多路复用之epoll

    python网络编程——IO多路复用之epoll 1.内核EPOLL模型讲解     此部分参考http://blog.csdn.net/mango_song/article/details/4264 ...

  7. python网络编程应用(一)

     在之前的一篇博客<python网络编程基础>中介绍了socket.socket()函数及其应用,其实socket模块中还有很多属性可供网络应用程序使用.这里将详细讲解一下socket模块 ...

  8. Python网络编程--Echo服务

    Python网络编程--Echo服务 学习网络编程必须要练习的三个小项目就是Echo服务,Chat服务和Proxy服务.在接下来的几篇文章会详细介绍. 今天就来介绍Echo服务,Echo服务是最基本的 ...

  9. 28、Python网络编程

    一.基于TCP协议的socket套接字编程 1.套接字工作流程 先从服务器端说起.服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客 ...

随机推荐

  1. intelliJ IDEA安装、激活与汉化

    1.去intelliJ IDEA 官网下载idea,选择Ultimate版本(非免费版,community免费但功能较少) 2.开始安装 3.选择好路径 4.选择在桌面创建的快捷方式(注意32bit和 ...

  2. LeetCode 243. Shortest Word Distance (最短单词距离)$

    Given a list of words and two words word1 and word2, return the shortest distance between these two ...

  3. 解决执行sql脚本报错:没有足够的内存继续执行程序。

    出现执行sql脚本报错:没有足够的内存继续执行程序.是因为sql脚本过大,大家可能分为多个文件多次执行,这种笨方法可行,不过比较麻烦,大家可以用下面的方式,利用sqlcmd一次就行了:   执行cmd ...

  4. Myeclipse常见快捷键及配置

    0. 快捷键 ================================================================================ 编辑: Ctrl+Shi ...

  5. Leetcode题解(十八)

    51.N-Queens ---------------------------------------------------------------------------------分割线---- ...

  6. 磁盘管理 之 parted命令添加swap,文件系统

    第1章 磁盘管理 1.1 必须要了解的. 1.1.1 ps aux 命令中 RSS 与VSZ的含义 rss 进程占用的物理内存的大小 单位:kb : vsz 进程占用的虚拟的内存大小(物理内存+swa ...

  7. 利用quartz实现定时调度

    1.Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.这里我介绍quartz的两种方式.我这里搭建 ...

  8. SVG绘制loading效果

    <div class="loading"> <svg width='40px' height='40px' xmlns="http://www.w3.o ...

  9. phonegap与H5中的接口对比

    接口 HTML5 phonegap 差异 地理定位 geolocation 单次定位: navigator.geolocation.getCurrentPosition(Success, [error ...

  10. React Native填坑之旅 -- 使用react-navigation代替Navigator

    Navigator已经被React Native废弃了.也许你可以在另外的一个依赖库里react-native-deprecated-custom-components里找到.不过既然官方推荐的是re ...