2

我有一个通过 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,因此这些会随着时间的推移而累积。有什么想法为什么会发生以及我做错了什么?

4

1 回答 1

1

当本地程序未关闭套接字时,套接字会在 CLOSE_WAIT 中挂起。

查看 imaplib源代码,唯一self.sock.close()调用的地方是 in shutdown()

我猜你需要打电话self.connection.shutdown()

更新:正如布鲁诺所说,logout()调用shutdown(). 但是,示例代码的结构方式,如果close()引发异常,logout()则将被静默跳过......并且shutdown()不会被调用。我想知道这是否是怎么回事。

于 2012-03-01T06:39:51.337 回答