我在webapp(用于测试的CGI,用于生产的FastCGI)中使用Python,需要偶尔发送电子邮件(当用户注册或其他重要事件发生时)。由于与SMTP服务器通信需要很长时间,因此我想为邮件功能生成一个线程,以便应用程序的其余部分可以完成请求,而无需等待电子邮件完成发送。
我尝试使用thread.start_new(func, (args))
,但是父return
'并在发送完成之前退出,从而在执行任何有用之前终止发送过程。反正有没有让这个过程保持足够长的时间让子进程完成?
答案 0 :(得分:3)
查看thread.join()
方法。基本上它会阻塞你的调用线程,直到子线程返回(从而阻止它在它应该退出之前)。
更新
为避免主线程对新请求无响应,您可以使用while循环。
while threading.active_count() > 0:
# ... look for new requests to handle ...
time.sleep(0.1)
# or try joining your threads with a timeout
#for thread in my_threads:
# thread.join(0.1)
更新2:
thread.start_new(func, args)
似乎obsolete。它已更新为thread.start_new_thread(function, args[, kwargs])
您还可以使用更高级别的线程包创建线程(这是允许您在前一个代码块中获取active_count()
的包):
import threading
my_thread = threading.Thread(target=func, args=(), kwargs={})
my_thread.daemon = True
my_thread.start()
答案 1 :(得分:0)
如果您有多个工作人员并且想要查看哪个(哪些)仍在运行,您可能需要使用threading.enumerate。
其他替代方法包括使用threading.Event ---主线程将事件设置为True并启动工作线程。如果完成工作,工作线程将取消设置事件,并且主要检查是否设置/取消设置事件以确定它是否可以退出。