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)
    代码
  • 相关阅读:
    初认识AngularJS
    (imcomplete) UVa 10127 Ones
    UVa 10061 How many zero's and how many digits?
    UVa 11728 Alternate Task
    UVa 11490 Just Another Problem
    UVa 10673 Play with Floor and Ceil
    JSON对象和字符串的收发(JS客户端用typeof()进行判断非常重要)
    HTML.ActionLink 和 Url.Action 的区别
    EASYUI TREE得到当前节点数据的GETDATA方法
    jqueery easyui tree把已选中的节点数据拼成json或者数组(非常重要)
  • 原文地址:https://www.cnblogs.com/TF511/p/9958964.html
Copyright © 2011-2022 走看看