我有一个通过IMAP4_SSL连接到IMAP服务器的python代码,一切正常,直到它尝试用这个关闭连接:
def logout(self):
"Close the mailbox and logout and set the connection to None"
try:
self.connection.close()
self.connection.logout()
except e:
pass
self.connection = None
这使连接处于CLOSE_WAIT状态:
tcp 38 0 1.2.3.4:55809 5.6.7.8:993 CLOSE_WAIT 18983/python2.6
长时间存在的地方。 python进程本身是一个长期运行的守护进程,它会定期进行IMAP检查,因此会随着时间的推移而累积。任何想法为什么会发生以及我做错了什么?
答案 0 :(得分:1)
当CLOSE_WAIT尚未被本地程序关闭时,套接字会挂起。
查看imaplib source,调用self.sock.close()
的唯一位置是shutdown()
。
我的猜测是你需要拨打self.connection.shutdown()
。
更新:正如布鲁诺所说,logout()
致电shutdown()
。但是,结构化示例代码的方式如果close()
引发了一个异常,那么logout()
将被静默跳过...并且shutdown()
将不会被调用。我想知道这是不是正在发生的事情。