以前在使用阻塞(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的样子?