0
0

用alarm信号处理阻塞socket的超时

Xiaoxia 发表于 2011年11月22日 22:10 | Hits: 2851
Tag: Internet | Linux | 我的代码 | alarm | signal | socket | timeout

以前在使用阻塞(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/

0     0

我要给这篇文章打分:

可以不填写评论, 而只是打分. 如果发表评论, 你可以给的分值是-5到+5, 否则, 你只能评-1, +1两种分数. 你的评论可能需要审核.

评价列表(1)

  • +0 ideawu voted at 2011-11-22 23:32:19

    比较好的方法还是使用IO多路复用, 适用范围也更广, 扩展性也更好.