Xiaoxia[PG]

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

Internet、Linux、我的代码11 条评论

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

11 条评论

  1. 代码还是settimeout超时看起来舒服。

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

      1. 其实用select监听connect也是阻塞的,跟settimeout没什么区别。

        1. 嗯,但是在connect之前,也要设置为非阻塞,再connect,之后select吧

          1. 是的,select不禁可以监听socket的读、写、错误、关闭连接,还可以监听非阻塞socket的connect。

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

    1. 你out了。。。这个已经是10个月前的事情了!

      1. Python用起来很顺手,我也在用:)

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

    1. 用python写过tkinter和gkt而已,怎么啦?
      教程在这里
      http://zetcode.com/

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

发表评论

评论会经过自动审核,链接请勿超过 3 个。