0

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')
4

1 に答える 1