这是一个通用问题,我寻求答案,因为我在公司代码库中看到了一位前员工提出的芹菜任务。
这是一个共享任务,调用一个终结点,如下所示
@shared_task(time_limit=60*60)
def celery_task_here(some_args):
data = get_data(user, url, server_name)
# some other logic to build csv and stuff
def get_data(user, url, server_name):
client = APIClient()
client.force_authenticate(user=user)
response = client.get(some_url, format='json', SERVER_NAME=server_name)
所有逻辑都驻留在该终结点中。
现在我的理解是,这将使服务器完成所有工作并且不利用芹菜的优势,但是当我在本地运行它时,我确实看到芹菜日志生成查询。我想知道在这种情况下谁在做这项工作,芹菜还是 django 服务器?
如果通过celery_task_here.delay
调用任务,任务将被推送到队列中,那么负责处理队列的工作进程将实际执行该任务,它不是"Django 服务器"。工作进程可能与你的 Django 实例在同一台机器上,这取决于你的环境。
如果你通过celery_task_here.s
调用任务(或作为普通函数(,任务将由Django 服务器执行。
这取决于任务的调用方式
如果它被调用为具有apply_async
或delay
的芹菜任务,则它由芹菜工人进程作为芹菜任务执行
如果您只是将其称为函数,您仍然可以将其作为普通函数调用而无需将其发送到芹菜