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

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

用alarm信号处理阻塞socket的超时》有11个想法

    1. Xiaoxia 文章作者

      嗯,我最常用的也是settimeout。我也看到有人设置为非阻塞,然后使用select来做的。

      回复

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据