首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python socket.accept无阻塞?

Python socket.accept无阻塞?
EN

Stack Overflow用户
提问于 2011-03-15 14:06:05
回答 2查看 37.1K关注 0票数 22

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-15 14:18:24

你可能想要像select.select()这样的东西(参见documentation)。您为select()提供了三个套接字列表:要监视其可读性、可写性和错误状态的套接字。当新的客户端在等待时,服务器套接字将是可读的。

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

下面是一个哑巴回显服务器示例:

代码语言:javascript
复制
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版本。

票数 35
EN

Stack Overflow用户

发布于 2011-03-15 14:16:35

您可以调用套接字上的setblocking(0)方法,使其成为非阻塞的。看看asyncore module或者像Twisted这样的框架。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5308080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档