Xiaoxia[PG] Yesterday is history, tomorrow is mistery, today is a gift!

22十一/1111

用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

喜欢这个文章吗?

考虑订阅我们的RSS Feed吧!

评论 (11) 引用 (0)
  1. 代码还是settimeout超时看起来舒服。

  2. 板凳……
    小虾迷上python了……

  3. 小虾有没有用python写gui的经验?求推荐

  4. 问一下有没有异步socket处理读取超时的方法,似乎要用heapq的样子?


Leave a comment

(required)

还没有引用.