Python的socket.accept非阻塞吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (213)

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

提问于
用户回答回答于

你可能想要类似的东西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

用户回答回答于

您可以调用setblocking(0)Socket上的方法使其无阻塞。查看asyncore模块或像Twisted这样的框架。

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动