我正在尝试通过电子邮件发送一些回溯,我正在使用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
类调用connect()
createconnection
调用使用linux getaddrinfo()
mycode-->smtplib.SMTP---> __init__--->connect---->createconnection()--->getaddrinfo()
通话路径:
getaddrinfo()
SMTP
来电永远不会回来。这是一个悬念。可能是什么问题呢?另外,我没有从send_mail_thread()
lib收到任何追溯或异常。那是因为我已经抓住了一个例外吗?
仅当我在except
块内调用except Exception:
send_email_thread(from_addr,to_addr, str(traceback.format_exc()))
函数时才会发生这种情况。从上面:
multiprocessing
我尝试将它放在外面并且有效!哪些信号表明捕获异常然后运行此异常可能导致问题?有什么指针吗?我在Linux上使用python 2.7
[编辑]
在下面的一些评论之后,我想添加以下更新。代码在从另一个主进程创建的进程内运行(使用send_email_function
模块)。然后在此子进程的线程内调用getaddrinfo()
。
我创建了一个更简单的程序来测试它,其中所有内容都在一个进程中完成。它成功了。这意味着当某个子进程中存在异常或multiprocessing
模块处理POSIX调用的程度