在Python中关闭套接字

4

我正在修改具有以下形式的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语句块以确保套接字被关闭。是否应该在这段代码中也加入try-finally语句块呢?还是说Python自己有某种魔力可以自动处理这个问题呢?

我在Python文档中读到过套接字会在垃圾回收时关闭。但是仅仅依靠垃圾回收器来关闭套接字并不是一个好的做法。

3个回答

12

你可以使用Python 2.5中添加的try-finally块:

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类在其__exit__()方法中关闭,这将自动关闭套接字。

在Python 2.7.2中,socket类没有实现__exit__()方法。


3
Python一直都有try-finally语句。自2.5版本起,它将try-except-finally语句进行了统一。详见http://docs.python.org/reference/compound_stmts.html#the-try-statement。 - JimB

1

0

1
套接字超时不会关闭套接字。它会超时读取(可能还有连接/写入),但保持套接字打开,以便用户可以重试操作。 - Dima Tisnek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接