多路复用

Posted jason-lin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多路复用相关的知识,希望对你有一定的参考价值。

select实现ftp

import select
import socket

server = socket.socket()
server.bind((‘127.0.0.1‘, 9991))
server.listen(10)
server.setblocking(False)

r_list = [server, ]
w_list = []
w_data = {}

while True:
    rl, wl, xl = select.select(r_list, w_list, [], 0.5)
    print(wl)
    for sock in rl:
        if sock == server:
                conn, addr = server.accept()
                r_list.append(conn)
        else:
            try:
                data = sock.recv(1024).decode()
                if not data:
                    sock.close()
                    r_list.remove(sock)
                    continue
                w_list.append(sock)
                w_data[sock] = data.upper().encode()
    
            except Exception as e:
                print(e)
                sock.close()
                r_list.remove(sock)

selectors 实现ftp

import selectors
import socket


def accept(obj, mask):
    conn,addr = obj.accept()
    sel.register(conn, selectors.EVENT_READ, read)
    

def read(obj,mask):
  
    try:
        data = obj.recv(1024).decode()
        if not data:
            sel.unregister(obj)
            obj.close()
            return
        print(data)
        obj.send(data.upper().encode())
    except Exception as e:
        print(e)
        obj.close()
        sel.unregister(obj)
    

server = socket.socket()
server.bind((‘127.0.0.1‘, 9990))
server.listen(10)
server.setblocking(False)
sel = selectors.DefaultSelector()
sel.register(server, selectors.EVENT_READ, accept)
while True:
    events = sel.select()
    for obj, mask in events:
        callback = obj.data
        callback(obj.fileobj, mask)

以上是关于多路复用的主要内容,如果未能解决你的问题,请参考以下文章

为啥 4 位多路复用器测试台代码给出 x?

Kotlin 协程协程中的多路复用技术 ② ( select 函数原型 | SelectClauseN 事件 | 查看挂起函数是否支持 select )

你管这破玩意叫 IO 多路复用?

Python IO多路复用

多路转接(IO复用)接口介绍

多路复用io接口-epoll