9.16 非阻塞IO模型

cpu占用率过高

服务端:

from socket import *
import time
s = socket()
s.bind(('127.0.0.1',8080))
s.listen(5)
s.setblocking(False) #使accept接收不到连接时不在阻塞

r_list=[]
while True:
try:
conn, addr = s.accept()
r_list.append(conn)
except BlockingIOError:
# time.sleep(3)
#print('可以去干其他的活了')
#print('rlist: ',len(r_list))
for conn in r_list:
try:
data=conn.recv(1024)
conn.send(data.upper())
except BlockingIOError:
continue

客户端;

from socket import *
import os
client = socket()
client.connect(('127.0.0.1', 8080))

while True:
data='%s say hello' %os.getpid()
client.send(data.encode('utf-8'))
res=client.recv(1024)
print(res.decode('utf-8'))

9.17 I/O多路复用

服务端:

from socket import *
import select
s = socket()
s.bind(('127.0.0.1',8080))
s.listen(5)
s.setblocking(False) #使accept接收不到连接时不在阻塞
# print(s)

r_list=[s,]
w_list=[]
w_data={}
while True:
print('被检测r_list: ',len(r_list))
print('被检测w_list: ',len(w_list)) #rl中是r_list中建立连接的套接字对象
rl,wl,xl=select.select(r_list,w_list,[],) #r_list=[server,conn]
# print('rl: ',len(rl)) #rl=[conn,]
# print('wl: ',len(wl))

# 收消息
for r in rl: #r=conn
if r == s:
conn,addr=r.accept()
r_list.append(conn)
else:
try:
data=r.recv(1024)
if not data:
r.close()
r_list.remove(r)
continue
# r.send(data.upper())
w_list.append(r)
w_data[r]=data.upper()
except ConnectionResetError:
r.close()
r_list.remove(r)
continue
# 发消息
for w in wl:
w.send(w_data[w])
w_list.remove(w)
w_data.pop(w)

客户端:

from socket import *
import os
client = socket()
client.connect(('127.0.0.1', 8080))

while True:
data='%s say hello' %os.getpid()
client.send(data.encode('utf-8'))
res=client.recv(1024)
print(res.decode('utf-8'))

9.18 socketserver的使用

9.181 基于tcp的socketserver

服务端:

import socketserver
# 通信循环
class MytcpHandler(socketserver.BaseRequestHandler):
def handle(self):
while True:
try:
data = self.request.recv(1024) # 1024 接收数据的最大限制
if not data: break # 针对linux系统
self.request.send(data.upper()) # 注意:收发都是以bytes为单位
except ConnectionResetError:
break
self.request.close()

if __name__ == '__main__':
#连接循环
server=socketserver.ThreadingTCPServer(('127.0.0.1',8080),MytcpHandler)
server.serve_forever()

print(server.server_address)
print(server.RequestHandlerClass)
print(server.socket)

客户端:

import socket
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('127.0.0.1',8080))

while True:
msg=input('>>: ').strip()
client.send(msg.encode('utf-8'))
data=client.recv(1024)
print(data.decode('utf-8'))
client.close()

9.182 基于udp的socketserver

服务端:

import socketserver
# 通信循环
class MyUDPHandler(socketserver.BaseRequestHandler):
def handle(self):
print(self.request)#(b'13404 hello', <socket.socket fd=460, family=AddressFamily.AF_INET,
res=self.request[0]#type=SocketKind.SOCK_DGRAM, proto=0, laddr=('127.0.0.1', 8080)>)
print('客户端发来的数据:',res) self.request[1].sendto(res.upper(),self.client_address)

if __name__ == '__main__':
#连接循环
server=socketserver.ThreadingUDPServer(('127.0.0.1',8080),MyUDPHandler)
server.serve_forever()

客户端:

import socket
import os
client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

while True:
msg='%s hello' %os.getpid()
client.sendto(msg.encode('utf-8'),('127.0.0.1',8080))

res,server_addr=client.recvfrom(1024)
print(res)

python 之 并发编程(非阻塞IO模型、I/O多路复用、socketserver的使用)的更多相关文章

  1. python 并发编程 非阻塞IO模型

    非阻塞IO(non-blocking IO) Linux下,可以通过设置socket使其变为non-blocking.当对一个non-blocking socket执行读操作时,流程是这个样子: 从图 ...

  2. Python之阻塞IO模型与非阻塞IO模型

    Python之阻塞IO模型与非阻塞IO模型 IO模型 1 阻塞IO: 全程阻塞 2 非阻塞IO: 发送多次系统调用: 优点:wait for data时无阻塞 缺点:1 系统调用太多 2 数据不是实时 ...

  3. 多路复用 阻塞/非阻塞IO模型 网络IO两个阶段

    1.网络IO的两个阶段 waitdata copydata send 先经历:copydata阶段 recv 先经历:waitdata阶段 再经历 copydata阶段 2.阻塞的IO模型 之前写的都 ...

  4. IO模型,非阻塞IO模型,select实现多路复用

    1. IO阻塞模型 IO问题: 输入输出 我要一个用户名用来执行登陆操作,问题用户名需要用户输入,输入需要耗时, 如果输入没有完成,后续逻辑无法继续,所以默认的处理方式就是 等 将当前进程阻塞住,切换 ...

  5. 网络IO模型 非阻塞IO模型

    网络IO模型 非阻塞IO模型 同步 一件事做完后再做另一件事情 异步 同时做多件事情 相对论 多线程 多进程 协程 异步的程序 宏观角度:异步 并发聊天 阻塞IO 阻塞IO的问题 一旦阻塞就不能做其他 ...

  6. 非阻塞IO模型

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> # ...

  7. NIO【同步非阻塞io模型】关于 NIO socket 的详细总结【Java客户端+Java服务端 + 业务层】【可以客户端间发消息】

    1.前言 以前使用 websocket来实现双向通信,如今深入了解了 NIO 同步非阻塞io模型 , 优势是 处理效率很高,吞吐量巨大,能很快处理大文件,不仅可以 做 文件io操作, 还可以做sock ...

  8. python 之网络并发(非阻塞IO模型)

    实现gevent模块 服务端: from socket import * import time s = socket() s.bind(('127.0.0.1',8080)) s.listen(5) ...

  9. python 之 并发编程(生产者消费者模型、守护进程的应用)

    9.8 生产者消费者模型 该模型中包含两类重要的角色: 1.生产者:将负责造数据的任务比喻为生产者 2.消费者:接收生产者造出的数据来做进一步的处理的被比喻成消费者 实现生产者消费者模型三要素:1.生 ...

随机推荐

  1. python mongo存在插入不存在更新,同时指定如果不存在才插入的字段

    python爬虫的任务数据操作的小技巧 好久没写公众号了,最近太忙了,这里就不多说了.直接根据需求上代码,我想这个应该是大家比较喜欢的, 需求 爬取某网站的项目列表页,获取其url,标题等信息,作为后 ...

  2. DH密钥加解密

    一.概述 1.与对称加密算法的主要差别在于,加密和解密的密钥不相同,一个公开(公钥),一个保密(私钥).主要解决了对称加密算法密钥分配管理的问题,提高了算法安全性. 2.非对称加密算法的加密.解密的效 ...

  3. 11.linux dns服务器建立和安装apache

    dns服务器建立 1.安装bind建立dns服务器     yum install bind -y 2.安装好修改配置文件:vim /etc/named.conf 修改:      listen-on ...

  4. [转]OpenGL编程指南(第9版)环境搭建--使用VS2017

    1.使用CMake Configure中选择VS2017 Win64 , Finish: 点击Generate. 2.进入build目录 打开GLFW.sln , 生成解决方案. 打开vermilio ...

  5. 借助中间件优化代码 将请求RequestId在服务端接收到请求在处理业务逻辑之前生成

    将请求RequestId在服务端接收到请求在处理业务逻辑之前生成

  6. vim 显示行号 临时&永久

    设置vim 永久显示行号 - electrocrazy的博客 - CSDN博客https://blog.csdn.net/electrocrazy/article/details/79035216 v ...

  7. Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:值类型的功能

    ylbtech-Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:值类型的功能 1.返回顶部 1. 值类型(C# 参考) 2018/11/26 有两种值类型: 结构 枚举 值类型的主 ...

  8. pytorch torch.nn.functional实现插值和上采样

    interpolate torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest', ali ...

  9. mat文件读写

    一起来学演化计算-mat文件读写 觉得有用的话,欢迎一起讨论相互学习~Follow Me Matlab读取和保存mat文件数据 在matlab命令行中输入save 变量名a,将a变量保存在新生成的a. ...

  10. ABAP函数篇2 测试DATE_CONVERT_TO_FACTORYDATE

    DATE_CONVERT_TO_FACTORYDATE   根据日期返回工厂日历日期 函数功能说明: 标出工作日的计算方法 输入传输 CORRECT_OPTION = '+'如果指定的日期不是工作日, ...