Python socket.accept非阻塞?

发布于 2021-01-29 18:40:27

有没有一种方法可以以非阻塞方式使用python的socket.accept()来简单地运行它,并让我检查它是否有任何新连接?我 真的
不想使用线程。谢谢。

关注者
0
被浏览
154
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可能想要类似的东西select.select()(请参阅文档)。您提供select()了三个套接字列表:您要监视其可读性,可写性和错误状态的套接字。当新的客户端正在等待时,服务器套接字将是可读的。

    select()功能将一直阻塞,直到套接字状态之一改变为止。timeout如果您不想永远阻塞,可以指定第四个可选参数。

    这是一个哑响应服务器示例:

    import select
    import socket
    
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server_socket.bind(('', 8888))
    server_socket.listen(5)
    print "Listening on port 8888"
    
    read_list = [server_socket]
    while True:
        readable, writable, errored = select.select(read_list, [], [])
        for s in readable:
            if s is server_socket:
                client_socket, address = server_socket.accept()
                read_list.append(client_socket)
                print "Connection from", address
            else:
                data = s.recv(1024)
                if data:
                    s.send(data)
                else:
                    s.close()
                    read_list.remove(s)
    

    Python同时使用epollpoll以及kqueue用于支持它们的平台上实现。它们是的更有效版本select



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看