子线程之前退出父线程[python]

时间:2010-05-17 15:50:52

标签: python multithreading smtp cgi

我在webapp(用于测试的CGI,用于生产的FastCGI)中使用Python,需要偶尔发送电子邮件(当用户注册或其他重要事件发生时)。由于与SMTP服务器通信需要很长时间,因此我想为邮件功能生成一个线程,以便应用程序的其余部分可以完成请求,而无需等待电子邮件完成发送。

我尝试使用thread.start_new(func, (args)),但是父return'并在发送完成之前退出,从而在执行任何有用之前终止发送过程。反正有没有让这个过程保持足够长的时间让子进程完成?

2 个答案:

答案 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并启动工作线程。如果完成工作,工作线程将取消设置事件,并且主要检查是否设置/取消设置事件以确定它是否可以退出。