在Python中关闭套接字
我正在修改一段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 个回答
除了使用try/finally这个结构外,你还可以设置一个默认的超时时间,这样在你指定的时间后,socket(网络连接)会自动关闭。
http://docs.python.org/library/socket.html?highlight=setdefaulttimeout#socket.setdefaulttimeout
你似乎想在2.5版本的try/except中加入finally块。
http://docs.python.org/whatsnew/2.5.html#pep-341-unified-try-except-finally
你说得对,依靠垃圾回收来自动关闭资源并不是个好习惯,最好在用完后自己手动关闭它们。使用try/finally是一种不错的做法。
别忘了在关闭之前调用shutdown()。
你可以使用一个叫做 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__()
方法。