我在使用python RQ运行多线程任务时遇到问题(在v0.5.6和v0.6.0上测试)。
考虑以下代码,作为我想要实现的简化版本:
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()
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运行多线程任务,以便超时会杀死任务,它的儿子,孙子和他们的妻子?
答案 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