zoukankan      html  css  js  c++  java
  • 非阻赛IO模型

    实例一:

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

    from concurrent.futures import ThreadPoolExecutor
    import socket
    
    server = 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 time
    while 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 socket
    
    c = 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)
    代码
  • 相关阅读:
    圣诞快乐有感
    今天填补了尹大神的一个小瑕疵 被他戏称接锅侠 有感
    统计js数组中奇数元素的个数
    PHP实现一致性哈希算法
    寻找一组数的最大值并统计出现次数
    得知尹大神最后一天在岗位工作明天即将离开有感
    小物件之checkbox复选框
    处理特殊格式的GET传参
    vim分屏
    【学习笔记】Docker基础
  • 原文地址:https://www.cnblogs.com/TF511/p/9958964.html
Copyright © 2011-2022 走看看