天天看點

單程序+單線程+異步IOLoop python 伺服器 demo

import socket, selectors

# 擷取相應作業系統最佳的selector
sel = selectors.DefaultSelector()

# 得知有請求進來時,接受請求
def accept(sock, mask):
    conn, addr = sock.accept()
    conn.setblocking(False)
    sel.register(conn, selectors.EVENT_READ, read_handler)

# 得知有消息發送過來時,處理請求
def read_handler(conn, mask):
    data = conn.recv(2048)
    print('recv data: ' + str(data, 'utf-8') + str(mask))
    conn.send(b'back: ' + data)
    sel.unregister(conn)
    conn.close()

# 啟動伺服器
def run_server(addr_info):
    sock = socket.socket()
    sock.bind(addr_info)
    sock.listen(5)
    sock.setblocking(False)
    sel.register(sock, selectors.EVENT_READ, accept)
    print('begin..')
    while True:
        events = sel.select()
        for key, mask in events:
            callback = key.data
            callback(key.fileobj, mask)


if __name__ == '__main__':
    addr_info = ('localhost', 1111)
    run_server(addr_info)