2013-05-28 40 views
5

我正在使用http://python-rq.org/在Heroku工人dynos上排队和执行任务。这些是长期运行的任务,偶尔我需要在执行中取消它们。我如何从Python做到这一点?在Python RQ中取消已经执行的任务?

from redis import Redis 
from rq import Queue 
from my_module import count_words_at_url 

q = Queue(connection=Redis()) 
result = q.enqueue(
      count_words_at_url, 'http://nvie.com') 

,后来在一个独立的过程中,我想做的事:

from redis import Redis 
from rq import Queue 
from my_module import count_words_at_url 

q = Queue(connection=Redis()) 
result = q.revoke_all() # or something 

谢谢!

+0

你有没有想过这个?如果是这样,我很乐意提供解决方案。 Thx – johnpaulhayes

+0

不幸的是,我没有。我必须解决它。 –

+0

相关(但关闭)github问题在这里:https://github.com/nvie/rq/issues/339 – zaius

回答

2

如果你手头上有简单

job.cancel() 

或者作业实例,如果你能确定哈希:

from rq import cancel_job 
cancel_job('2eafc1e6-48c2-464b-a0ff-88fd199d039c') 

http://python-rq.org/contrib/

但是,这只是从队列中删除;如果已经执行,我不知道它会杀死它。

您可以让它记录挂壁时间,然后定期检查自己,并在一段时间后引发异常/自毁。

对于手动,即席风格,死亡:如果你有安装redis-cli你可以做一些激烈的像flushall队列和作业:

$ redis-cli 
127.0.0.1:6379> flushall 
OK 
127.0.0.1:6379> exit 

I'm still digging around the documentation,试图找到如何做一个精确杀伤。

不知道这是否有助于任何人,因为这个问题已经是18个月大了。

0

我认为最常见的解决方案是让工作人员产生另一个线程/进程来完成实际工作,然后定期检查作业元数据。要终止任务,请在元数据中设置一个标志,然后让工作者终止正在运行的线程/进程。