3

SMTPPython 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)

ハングアップして戻りません。問題を少し掘り下げると、Linuxを使用するソケット関数を順番に呼び出すクラス呼び出しであること__init__がわかりましたSMTPconnect()createconnectiongetaddrinfo()

呼び出しパス:

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、この子プロセスのスレッド内で が呼び出されます。

これをテストするために、すべてが 1 つのプロセスで行われる、より単純なプログラムを作成しました。そして、それはうまくいきました。つまりgetaddrinfo()、一部の子プロセスで例外が発生した場合の動作、またはmultiprocessingモジュールが POSIX 呼び出しを適切に処理する方法に問題 (デッドロック) があることを意味します。

4

0 に答える 0