Во второй версии вместо
t = Thread(target=email.sendmail(msg))
вы должны сделать
t = Thread(target=email.sendmail, args=[msg])
Как вы написали, он оценивает email.sendmail(msg)
перед построение потока, поэтому вы видите, что вы ждете 5 секунд, прежде чем продолжить.
Вместо этого вы должны передать потоку целевую функцию и ее аргументы отдельно, без их оценки.
Вот фиксированный и минимизированная версия:
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)
print("Launched thread: I'm done sleeping!")
return
if __name__ == "__main__":
print('Main thread: Starting threaded call to send V1 class')
email = EMailv1()
msg = email.buildmessage(a='a', b='b')
t = Thread(target=email.sendmail, args=[msg])
t.start()
print("Main thread: I have created the thread, and am done.")
Вывод:
Main thread: Starting threaded call to send V1 class
Main thread: I have created the thread, and am done.
Launched thread: I'm done sleeping!
С учетом сказанного, я также предлагаю вам взглянуть на некоторые абстракции, предоставленные в Python для выполнения многопоточной работы . Например, обратите внимание на такие функции, как ThreadPoolExecutor - обычно они предпочтительнее работать напрямую с Thread
s.