0
0
0
1
用alarm信号处理阻塞socket的超时
Xiaoxia 发表于 2011年11月22日 22:10 | Hits: 2851
以前在使用阻塞(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
原文链接: http://xiaoxia.org/2011/11/22/signal-alarm-socket-timeout/
我要给这篇文章打分:
可以不填写评论, 而只是打分. 如果发表评论, 你可以给的分值是-5到+5, 否则, 你只能评-1, +1两种分数. 你的评论可能需要审核.