Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 每个芹菜工人的定期任务_Python_Celery - Fatal编程技术网

Python 每个芹菜工人的定期任务

Python 每个芹菜工人的定期任务,python,celery,Python,Celery,我正在寻找一种方法来对每个芹菜工人执行特定类型的任务。确切的用例是一个周期性的健康作业,它确保了任务初始化和进展成功的各种先决条件(这些指标报告给不同的服务)。例如,确保可以建立到DB的连接 我发现远程控制和检查命令可以用于此目的(使用一些固定的调度),但当AWS SQS用作后端代理时,它们不受支持 有没有想过如何在不向分叉流程任务添加任何内存占用的情况下实现这一点?也许可以在辅助进程中启动另一个线程 虽然您可以这样做(我将在下面进一步解释),但我建议您使用优秀的芹菜API。例如,status命

我正在寻找一种方法来对每个芹菜工人执行特定类型的任务。确切的用例是一个周期性的健康作业,它确保了任务初始化和进展成功的各种先决条件(这些指标报告给不同的服务)。例如,确保可以建立到DB的连接

我发现远程控制和检查命令可以用于此目的(使用一些固定的调度),但当AWS SQS用作后端代理时,它们不受支持

有没有想过如何在不向分叉流程任务添加任何内存占用的情况下实现这一点?也许可以在辅助进程中启动另一个线程

虽然您可以这样做(我将在下面进一步解释),但我建议您使用优秀的芹菜API。例如,
status
命令(以某种方式执行基本运行状况检查)就是以这种方式实现的,因此您可能应该将其用作自己实现的基础

在了解“inspect/control API”(我就是这么称呼它的)之前,我实现了一些类似于您想要做的事情,即为每个工作者分配一个唯一的队列名称。然后,“将任务发送给所有工作人员”将遍历所有唯一的队列名称(例如
worker\u 1
worker\u 2
,等等),并将任务发送到每个队列。

为了解决这个问题,我使用了。它在启动时注册一个计划任务,该任务每X秒将一个运行状况检查任务忽略到工作线程执行池中

此解决方案与后端代理无关,并利用自定义的工作执行池

class WorkerHealthMonitor(bootsteps.StartStopStep):
需要={'celery.worker.components:Timer',
'芹菜.worker.components:Pool'}
定义初始值(自我、工作者、**kwargs):
self.tref=无
self.interval=60
def启动(自身、工作人员):
logger.info(“以%d秒间隔注册运行状况监视器计时器”,self.interval)
self.tref=worker.timer.call\u重复(
自我间隔,计划健康检查,(工人),优先级=10,
)
def停止(自身、工作人员):
如果self.tref:
self.tref.cancel()
self.tref=无
def计划健康检查(工人):
worker.pool.apply\u async(运行状况检查,回调=运行状况检查完成)
def健康检查(**kwargs):
logger.info('正在运行运行状况检查…')
返回“我还活着”
def健康检查已完成(结果):
logger.info('运行状况检查已完成,消息:%s',结果)
任务注册:

app=芹菜('tasks',broker=broker\u URL,backend=backend\u URL)
应用步骤['worker'].添加(WorkerHealthMonitor)

是否安装了celerybeat?当然可以,但默认期间任务将仅由一名工作人员执行。我正在寻找一种对所有注册工人执行的方法,同时对MessageBroker实现不可知。感谢您的详细回答。我读了status命令代码,它的某些部分使用了inspect命令。它只支持RabbitMQ(AMQP)和Redis传输。任何其他传输(也许SQS除外)都是垃圾,我认为不应该使用。我喜欢这种方法!