在Python中关闭套接字

4 投票
3 回答
10270 浏览
提问于 2025-04-15 14:48

我正在修改一段Python代码,代码大致是这样的:

def foo(self):
    try:
        connect socket
    except Exception, e:
        some error reporting stuff
        return an error

    use the socket
    do some other stuff

    if some condition:
        return

    do some more stuff
    socket.close()
    return normally

我之前是用Java的,想在整个代码周围加个try - finally,确保套接字能被关闭。这个代码也需要这样做吗?还是说在Python里有某种神奇的机制,让你不需要这么做?

我在Python的文档里看到,套接字在被垃圾回收时会被关闭。但是,依赖垃圾回收来关闭套接字总感觉不太靠谱。

3 个回答

0

除了使用try/finally这个结构外,你还可以设置一个默认的超时时间,这样在你指定的时间后,socket(网络连接)会自动关闭。

http://docs.python.org/library/socket.html?highlight=setdefaulttimeout#socket.setdefaulttimeout

1

你似乎想在2.5版本的try/except中加入finally块。

http://docs.python.org/whatsnew/2.5.html#pep-341-unified-try-except-finally

你说得对,依靠垃圾回收来自动关闭资源并不是个好习惯,最好在用完后自己手动关闭它们。使用try/finally是一种不错的做法。

别忘了在关闭之前调用shutdown()。

12

你可以使用一个叫做 try-finally 的结构,这个是在 Python 2.5 版本中加入的:

try:
    open socket
    do stuff with socket
finally:
    close socket

或者你可以使用 with 语句,这个是在 Python 2.6 版本中加入的(在 2.5 版本中也可以使用,只需要加上 from __future__ import with_statement 这行代码):

with open_the_socket() as s:
    use s

这样做的话,当你退出内部代码块时,不管是正常退出还是因为出现错误退出,都会自动关闭这个 socket,只要 socket 类在它的 __exit__() 方法里实现了关闭功能。

不过在 Python 2.7.2 版本中,socket 类还没有实现 __exit__() 方法。

撰写回答