Python socket.accept nonblocking?

时间:2011-03-15 06:06:05

标签: python sockets tcp nonblocking

有没有办法可以以非阻塞方式使用python的socket.accept(),只需运行它,让我只检查它是否有任何新的连接?我确实不想使用线程。 感谢。

2 个答案:

答案 0 :(得分:30)

您可能想要select.select()之类的内容(请参阅documentation)。您向select()提供了三个套接字列表:要监视的套接字是否具有可读性,可写性和错误状态。当新客户端等待时,服务器套接字将是可读的。

select()函数将阻塞,直到其中一个套接字状态发生变化。如果您不想永久阻止,可以指定可选的第四个参数timeout

这是一个愚蠢的echo服务器示例:

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还为支持它们的平台提供epollpollkqueue实现。它们是select的更高效版本。

答案 1 :(得分:1)

您可以在Socket上调用setblocking(0)方法使其无阻塞。查看asyncore moduleTwisted等框架。