我正在尝试通过电子邮件发送一些回溯,我正在使用 python SMTP
lib。
我的代码看起来像这样
def send_email_thread(from_addr, to_addr, message):
server = smtplib.SMTP("smtp.googlemail.com", 587)
server.ehlo()
server.starttls()
server.login(SENDMAIL_SMTP_USER, SENDMAIL_SMTP_PASSWD)
server.sendmail(from_addr, to_addr, message)
server.quit()
我试图获取回溯的实际代码
try:
/*Something here that gives exception*/
except Exception:
send_email_thread(from_addr,to_addr, str(traceback.format_exc()))
现在的问题是这条线
server = smtplib.SMTP("smtp.googlemail.com", 587)
挂起并且不返回。在稍微挖掘问题时,我发现__init__
对于SMTP
类调用,后者又调用使用 linux 的connect()
套接字函数createconnection
getaddrinfo()
调用路径:
mycode-->smtplib.SMTP---> __init__--->connect---->createconnection()--->getaddrinfo()
getaddrinfo()
电话永远不会返回。这是挂机点。可能是什么问题呢?另外,我没有收到来自SMTP
lib 的任何回溯或异常。那是因为我已经发现了一个异常吗?
这只发生在我调用块send_mail_thread()
内的函数时except
。从上面:
except Exception:
send_email_thread(from_addr,to_addr, str(traceback.format_exc()))
我试着把它放在外面,它奏效了!哪些信号表明捕获异常然后运行它可能会导致问题?任何指针?我在 Linux 上使用 python 2.7
[编辑]
在下面的一些评论之后,我想添加以下更新。代码在从另一个主进程(使用multiprocessing
模块)创建的进程内运行。然后send_email_function
在这个子进程的线程中调用。
我创建了一个更简单的程序来测试这一点,其中所有事情都在一个进程中完成。它成功了。这意味着getaddrinfo()
当某些子进程出现异常或multiprocessing
模块处理 POSIX 调用的能力如何时,存在一些问题(死锁)