2010-05-17 66 views
1

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

我尝试使用thread.start_new(func, (args)),但父return的并在发送完成之前退出,从而杀死发送过程之前,它做任何有用的事情。无论如何要让这个过程保持足够长的时间才能完成子过程?

回答

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() 
+0

这可能会起作用,但是当以FastCGI的方式运行时,是不是会阻止脚本处理新的请求? – crgwbr 2010-05-17 16:17:40

+0

我从来没有使用FastCGI,但可能。你可以做的是把连接放在一个while循环中,并给它一个超时,所以它试图加入线程,超时并寻找新的请求。 – tgray 2010-05-17 16:33:28

+0

将它设置为一个守护进程看起来好像会起作用。我没有意识到'start_new'已被弃用。 谢谢 – crgwbr 2010-05-17 17:33:29

0

您可能需要使用threading.enumerate ,如果你有多个工人并且想要看哪一个仍在运行。

其他选择包括使用threading.Event ---主线程将事件设置为True并启动工作线程。工作线程在完成工作时解除事件,主要检查事件是否设置/未设置,以确定它是否可以退出。