首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我不能理解python中的轮询/选择

我不能理解python中的轮询/选择
EN

Stack Overflow用户
提问于 2011-09-18 12:06:08
回答 3查看 12.7K关注 0票数 13

我正在用python做一些线程异步网络实验,使用UDP。

我想了解轮询和选择python模块,我从未在C/C++中使用过它们。

这些是用来做什么的?我有点理解select,但它在查看资源时会阻塞吗?轮询的目的是什么?

EN

Stack Overflow用户

发布于 2013-12-14 03:46:13

select()接受3个套接字列表以检查三个条件(读取、写入、错误),然后返回(通常较短,通常为空)套接字列表,这些套接字列表实际上已准备好针对这些条件进行处理。

代码语言:javascript
运行
复制
s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s1.bind((Local_IP, Port1))
s1.listen(5)

s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s2.bind((Local_IP, Port2))
s2.listen(5)

sockets_that_might_be_ready_to_read = [s1,s2]
sockets_that_might_be_ready_to_write_to = [s1,s2]
sockets_that_might_have_errors = [s1,s2]


([ready_to_read], [ready_to_write], [has_errors])  = 
       select.select([sockets_that_might_be_ready_to_read],
                     [sockets_that_might_be_ready_to_write_to], 
                     [sockets_that_might_have_errors],            timeout)


for sock in ready_to_read:
    c,a = sock.accept()
    data = sock.recv(128)
    ...
for sock in ready_to_write:
    #process writes
    ...
for sock in has_errors:
    #process errors

因此,如果一个套接字在等待超时秒后没有尝试连接,那么列表ready_to_read将为空--此时,accept()和recv()是否阻塞都无关紧要--它们不会被调用为空的列表……

如果套接字准备好读取,那么If就会有数据,所以它也不会阻塞。

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

https://stackoverflow.com/questions/7459408

复制
相关文章

相似问题

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