以前在使用阻塞(blocked)socket的connect,send,recv函数的时候,通常都使用settimeout来设置超时。
如下,
#!/usr/bin/env python
import socket
import time
fd = socket.socket()
try:
print "connect", time.ctime()
fd.settimeout(5)
fd.connect(("twitter.com", 22))
except:
print "timeout", time.ctime()
finally:
fd.settimeout(0)
今晚看一本《TCP/IP高效编程》,看到了一种使用alarm的方法,
#!/usr/bin/env python
import signal
import socket
import time
def alarm_handler(signum, frame):
print "Singal number is", signum
raise Exception("Timeout")
fd = socket.socket()
try:
print "connect", time.ctime()
signal.signal(signal.SIGALRM, alarm_handler)
# Timeout set to 5 seconds
signal.alarm(5)
fd.connect(("twitter.com", 22))
except:
print "timeout", time.ctime()
finally:
# Disable alarm
signal.alarm(0)
两种方法的测试运行结果:
root@xiaoxia-pc:~/test# ./timeout.py
connect Tue Nov 22 21:38:29 2011
timeout Tue Nov 22 21:38:34 2011
root@xiaoxia-pc:~/test# ./alarm.py
connect Tue Nov 22 21:38:38 2011
Singal number is 14
timeout Tue Nov 22 21:38:43 2011
代码还是settimeout超时看起来舒服。
嗯,我最常用的也是settimeout。我也看到有人设置为非阻塞,然后使用select来做的。
其实用select监听connect也是阻塞的,跟settimeout没什么区别。
嗯,但是在connect之前,也要设置为非阻塞,再connect,之后select吧
是的,select不禁可以监听socket的读、写、错误、关闭连接,还可以监听非阻塞socket的connect。
板凳……
小虾迷上python了……
你out了。。。这个已经是10个月前的事情了!
Python用起来很顺手,我也在用:)
小虾有没有用python写gui的经验?求推荐
用python写过tkinter和gkt而已,怎么啦?
教程在这里
http://zetcode.com/
问一下有没有异步socket处理读取超时的方法,似乎要用heapq的样子?