在Python RQ中取消已经执行的任务?

12

我正在使用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

谢谢!


你最终解决了这个问题吗?如果是的话,我希望你能发布解决方案。谢谢。 - johnpaulhayes
很不幸,我没有。我必须想办法绕过它。 - Charles Offenbacher
相关(已关闭)的 Github 问题在此处:https://github.com/nvie/rq/issues/339 - zaius
3个回答

13

如果您手头有工作实例,只需

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个月了。


4

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


请您详细说明工人如何访问作业元数据?您确定工人可以动态地访问作业元数据,即作业元数据的更改会实时反映给工人吗? - Shahar Gino

1
docs中:
您可以使用send_stop_job_command()命令立即停止正在执行的工作。被停止的工作将被发送到FailedJobRegistry。
from redis import Redis
from rq.command import send_stop_job_command

redis = Redis()
send_stop_job_command(redis, job_id)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接