11

我正在使用http://python-rq.org/在 Heroku 工作人员测功机上排队和执行任务。这些是长时间运行的任务,有时我需要在执行过程中取消它们。我如何从 Python 中做到这一点?

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

谢谢!

4

2 回答 2

12

如果您手头有工作实例

job.cancel()

或者,如果您可以确定哈希:

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

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

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

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

对于手动的、临时的风格,死亡:如果你已经redis-cli安装了,你可以做一些激烈的事情,比如冲洗队列和作业:

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

我仍在挖掘文档以尝试找到如何进行精确击杀。

不确定这是否对任何人有帮助,因为这个问题已经 18 个月了。

于 2014-11-18T07:49:28.883 回答
4

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

于 2018-03-08T17:35:38.750 回答