MIME、添付ファイルなどを含むさまざまな電子メールを作成および送信するかなり大きな電子メール クラスがあります。コードを新しいスレッドで実行して、メイン ループを追跡し続けることができるようにしたいと考えています。
私は成功せずに2つのアプローチを試みました:
スレッドを使用してクラスを呼び出す
スレッドから V1 クラスを継承する
ブロッキングもやめないでください。以下は、私のクラス (V1) の作業スケルトンと、私が試したことです。sendmail が終了するまで 3 秒待つのではなく、「Starting」の直後に「Done」が表示されれば成功です。これを行う簡単な方法があることを願っています...
from time import sleep
from threading import Thread
class EMailv1():
def __init__(self):
self._from_address = 'a@b.com'
self._to_addresslist = []
def buildmessage(self, **kwargs):
message ={}
return message
@staticmethod
def sendmail(message):
sleep(5)
return
class EMailv2(Thread):
def __init__(self):
Thread.__init__(self)
self._from_address = 'a@b.com'
self._to_addresslist = []
def run(self):
pass
def buildmessage(self, **kwargs):
message ={}
return message
@staticmethod
def sendmail( message):
sleep(3)
return
if __name__ == "__main__":
print('Starting V1 class send in current manner, which blocks if smtplib cannot deliver mail')
email =EMailv1()
msg = email.buildmessage(a='a',b='b')
email.sendmail(msg)
print('v1 Done after sendmail sleep finishes')
print('Starting threaded call to send V1 class')
email = EMailv1()
msg = email.buildmessage(a='a',b='b')
t = Thread(target=email.sendmail(msg))
t.start()
print('Threaded call of V1 Done after sendmail sleep finishes')
print('Starting V2 class inheriting Thread')
email = EMailv2()
msg = email.buildmessage(a='a',b='b')
email.start()
email.sendmail(msg)
print('V2 Done after sendmail sleep finishes')