博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
非阻赛IO模型
阅读量:4508 次
发布时间:2019-06-08

本文共 2586 字,大约阅读时间需要 8 分钟。

实例一:

只能在waitdata 阶段找到IO的解决方案

from concurrent.futures import ThreadPoolExecutorimport socketserver = socket.socket()# 重用端口server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)server.bind(("192.168.11.210",9999))server.listen(5)# 设置是否为阻塞 默认阻塞server.setblocking(False)def data_handler(conn):    print("一个新连接..")    while True:        data = conn.recv(1024)        conn.send(data.upper())# 已连接的客户端clients = []# 需要发送的数据send_datas = []# 已经发送完的 需要删除的数据del_datas = []# 待关闭的客户端closed_cs = []import timewhile True:    try:        conn,addr = server.accept()        # 切到处理数据的任务去执行        # 代码走到这里才算是连接成功        # 把连接成功的客户端存起来        clients.append(conn)    except BlockingIOError:        # print("没有可以处理的连接 就干别的活儿")        #要处理的是已经连接成功的客户端        # 接收数据        for c in clients:            try:                data = c.recv(1024)                if not data:                    # 对方关闭了连接                    c.close()                    # 从客户端列表中删除它                    closed_cs.append(c)                    continue                print("收到%s" % data.decode("utf-8"))                # 现在非阻塞 send直接往缓存赛 如果缓存满了 肯定有错误  需要单独处理发送                # c.send(data.upper())                send_datas.append((c,data))            except BlockingIOError:                pass            except ConnectionResetError:                # 对方关闭了连接                c.close()                # 从客户端列表中删除它                closed_cs.append(c)        # 处理发送数据        for data in send_datas:            try:                data[0].send(data[1].upper())                # 发送成功需要删除 不能直接删除                # send_datas.remove(data)                del_datas.append(data)            except BlockingIOError:                continue            except ConnectionResetError:                # 客户端连接需要删除                data[0].close()                closed_cs.append(data[0])                # 等待发送的数据需要删除                del_datas.append(data)        # 删除无用的数据        for d in del_datas:            #从待发送的列表中删除            send_datas.remove(d)        del_datas.clear()        for c in closed_cs:            clients.remove(c)        closed_cs.clear()
服务端
import socketc = socket.socket()c.connect(("127.0.0.1",9999))while True:    msg = input(">>>:")    if not msg:continue    c.send(msg.encode("utf-8"))    data = c.recv(1024)    print(data.decode("utf-8"))
客户端

 

迭代期间不能修改被迭代的对象

li = [1,2,3,4,5,6]def mytlist_iter():    for i in range(len(li)):        yield li[i]for j in mytlist_iter():    if j == 5:        li.append(1000)d = {
"a":1,"b":2}for k in d: if k == "a": d.pop(k)
代码

 

转载于:https://www.cnblogs.com/TF511/p/9958964.html

你可能感兴趣的文章
第八十一节,CSS3变形效果
查看>>
WordCount 分析
查看>>
项目需求分析答辩总结
查看>>
PostgreSQL 利用pg_upgrade升级版本
查看>>
Mybatis分页插件PageHelper简单使用
查看>>
同步互斥——理发师睡觉问题
查看>>
Python编写的ARP扫描工具
查看>>
github之克隆
查看>>
IOS SWIFT基本画图教程
查看>>
Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果
查看>>
Android应用程序绑定服务(bindService)的过程源代码分析
查看>>
01背包问题,dp和贪心解法(c++11)
查看>>
PacificA协议小结
查看>>
android提示对话框
查看>>
OUC_Summer Training_ DIV2_#5
查看>>
java equals方法
查看>>
弧形菜单2(动画渐入)Kotlin开发(附带java源码)
查看>>
zabbix低级自动发现之mysql多实例
查看>>
实验六和实验十四
查看>>
用Swift重写公司OC项目(Day1)--程序的AppIcon与LaunchImage如何设置
查看>>