RQ超时不会终止多线程作业

时间:2016-08-03 10:36:26

标签: python multithreading python-2.7 python-rq django-rq

我在使用python RQ运行多线程任务时遇到问题(在v0.5.6和v0.6.0上测试)。

考虑以下代码,作为我想要实现的简化版本:

thing.py

from threading import Thread

class MyThing(object):
    def say_hello(self):
        while True:
            print "Hello World"

    def hello_task(self):
        t = Thread(target=self.say_hello)
        t.daemon = True # seems like it makes no difference
        t.start()
        t.join()

main.py

from rq import Queue
from redis import Redis
from thing import MyThing

conn = Redis()

q = Queue(connection=conn)

q.enqueue(MyThing().say_hello, timeout=5)

执行main.py时(当rqworker在后台运行时),作业会在5秒内按超时预期中断。

问题是,当我设置包含MyThing().hello_task等线程的任务时,线程会永远运行,并且当5秒超时结束时没有任何反应。

如何使用RQ运行多线程任务,以便超时会杀死任务,它的儿子,孙子和他们的妻子?

1 个答案:

答案 0 :(得分:1)

运行false时,t.join()线程会阻塞并等待hello_task线程返回 - 因此不会从rq接收超时信号。您可以允许主线程运行并使用say_hello并等待一段时间等待线程完成运行来正确接收超时信号。像这样:

Thread.join

这样你就可以捕获超时异常并处理它,如果你愿意的话:

def hello_task(self):
    t = Thread(target=self.say_hello)
    t.start()
    while t.isAlive():
        t.join(1)  # Block for 1 second