我正在用python做一些线程异步网络实验,使用UDP。
我想了解轮询和选择python模块,我从未在C/C++中使用过它们。
这些是用来做什么的?我有点理解select,但它在查看资源时会阻塞吗?轮询的目的是什么?
发布于 2013-12-14 03:46:13
select()接受3个套接字列表以检查三个条件(读取、写入、错误),然后返回(通常较短,通常为空)套接字列表,这些套接字列表实际上已准备好针对这些条件进行处理。
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就会有数据,所以它也不会阻塞。
https://stackoverflow.com/questions/7459408
复制相似问题