Dash Celery setup



我为我的Dash应用程序设置了docker compose。。我需要建议或首选的方式来设置我的芹菜图像。

我在以下用例中使用芹菜,这些用例是可取消/可中止/已撤销任务:

  • 上传文件
  • 模特培训
  • 创建列车、测试集

案例1。创建一个服务作为芹菜,command: ["celery", "-A", "tasks", "worker", "--loglevel=INFO", "--pool=prefork", "--concurrency=3", "--statedb=/celery/worker.state"]因此,这里我们使用默认队列、单个工作进程(主进程)和3个子进程/工作进程(即可以同时执行3个任务)现在,如果我撤销任何任务,它会杀死主工作进程还是只杀死执行该任务的子工作进程?

案例2.创建三个服务作为celeb-{task_name},即celeb-upload等,command: ["celery", "-A", "tasks", "worker", "--loglevel=INFO", "--pool=prefork", "--concurrency=1", , "--statedb=/celery/worker.state", "--queues=upload_queue", , "--hostname=celery_worker_upload_queue"]因此,我们在其容器中使用自定义队列、单个worker(main)和1个子/worker进程(即可以执行1个任务)。这样每个任务一个服务。现在,如果我撤销任何任务,它只会杀死主工作进程,或者只会杀死在相应容器中执行该任务的唯一子工作进程,而其余的芹菜容器将是活动的?

我尝试在命令任务中使用以下信号。revoke(terminate=True)

  • SIGKILL和SIGTERM在这篇文章中,我观察到@worker_process_shutdown.connect@task_revoked.connect都被解雇了。这是否意味着为其发出撤销命令的主工作进程和相关子工作进程(或主工作进程关闭时的所有子进程)关闭
  • SIGUSR1在这篇文章中,我观察到只有@task_revoked.connect被解雇。这是否意味着主工作进程仍在运行/活动,并且发出撤销命令的唯一相关子工作进程已关闭

首选哪种情况?有可能把这两种情况结合起来吗?即有单独的芹菜服务,有单独的工人(主要)和单独的童工流程和单独的队列或拥有单一的芹菜服务,具有单一的工作人员(主)、单独/专用的子工作人员进程和各自任务的单独队列?

还有一个疑问,正如我所认为的,使用芹菜是上面列出的任务所必需的,现在说我有清理数据帧的按钮,这也需要芹菜吗?即无论我在哪里处理数据帧,我都需要使用芹菜吗?

请提出建议。

更新-2工作进程=子工作进程

这就是我使用的方式

# Start button
result = background_task_job_one.apply_async(args=(n_clicks,), queue="upload_queue")
# Cancel button
result = result_from_tuple(data, app=celery_app)
result.revoke(terminate=True, signal=signal.SIGUSR1)
# Task
@celery_app.task(bind=True, name="job_one", base=AbortableTask)
def background_task_job_one(self, n_clicks):
msg = "Aborted"
status = False

try:
msg = job(n_clicks) # Long running task
status = True           
except SoftTimeLimitExceeded as e:
self.update_state(task_id=self.request.id, state=states.REVOKED)        
msg = "Aborted"
status = True
raise Ignore()
finally:
print("FINaLLY")
return status, msg

这种方式可以处理取消正在运行的任务吗?你能详细说明/解释一下这句话吗?[在实践中,你不应该直接向工人流程发送信号。]仅从第行【在预工作并发(默认)中,您将始终至少有两个进程在运行——Celery工作进程(协调器)和一个或多个Celery工作程序进程(工作者)】

这意味着芹菜-应用程序工作人员-P prefork->1个主要工作者和1个辅助工作者进程。它和下面一样吗芹菜-一个应用程序工作人员-P prefork-c 1->1名主要工作人员和1名辅助工作人员处理

早些时候,我尝试使用class AbortableTask并调用abort(),它成功地将状态和状态更新为ABORTED,但任务仍然有效/正在运行。

我读取终止当前正在执行的任务,必须传递terminate=True。这是有效的,任务停止执行,我需要手动将任务状态和状态更新为REVOKED,否则默认为PENDING。唯一要做的艰难决定是使用SIGKILL、SIGTERM或SIGUSR1。我发现使用SIGUSR1时,主工作进程是活动的,它只吊销了执行该任务的子工作进程。

此外,幸运的是,我找到了这个链接,我可以用多个专用的子进程及其专用队列来设置单个芹菜服务。

案例3:芹菜多

  1. command: ["celery", "multi", "show", "start", "default", "model", "upload", "-c", "1", "-l", "INFO", "-Q:default", "default_queue", "-Q:model", "model_queue", "-Q:upload", "upload_queue", "-A", "tasks", "-P", "prefork", "-p", "/proj/external/celery/%n.pid", "-f", "/proj/external/celery/%n%I.log", "-S", "/proj/external/celery/worker.state"]但是得到错误celery service exited code 0

  2. command: bash -c "celery multi start default model upload -c 1 -l INFO -Q:default default_queue -Q:model model_queue -Q:upload upload_queue -A tasks -P prefork -p /proj/external/celery/%n.pid -f /proj/external/celery/%n%I.log -S /proj/external/celery/worker.state"这里也得到错误

celery | Usage: python -m celery worker [OPTIONS]
celery | Try 'python -m celery worker --help' for help.

celery | Error: No such option: -p
celery | * Child terminated with exit code 2
celery | FAILED

有些疑问,一个工人和多个工人更喜欢什么?如果是具有专用队列的多工作者,则为每个任务创建docker服务也会增加docker文件和服务。因此,我尝试了一个带有多个专用子工作进程的芹菜服务及其专用队列,这很容易中止/撤销/取消任务。

但在案例3中得到错误,即芹菜多。请提出建议。

如果撤销任务,它可能会终止执行该任务的工作进程。Celery工作人员将继续工作,因为它需要协调其他工作流程。如果容器的寿命与Celery工作程序绑定,则容器将继续运行。在实践中,您不应该直接向工作进程发送信号。

在预工作并发(默认情况下)中,您将始终至少有两个进程在运行——Celery工作进程(协调器)和一个或多个Celery工作程序进程(工作者)。

为了回答最后一个问题,我们可能需要更多的细节。如果您可以在所有数据帧都可用的情况下运行Celery任务,这将更容易。如果不是这样,那么也许可以运行单独的任务来处理数据帧。值得一看Celery工作流,看看你是否可以构建Chunk ed工作流。保持简单,首先假设您同时拥有所有可用的数据帧,然后从中构建。

最新更新