最近项目中需要用到异步任务、定时任务,关于使用方法友友们都总结的很好,作为初学者,在这里记录一些学习过程中遇到的困惑,答案来自互联网,方便更好的理解和使用。
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
1、bind=True
当你在任务函数中使用@app.task(bind=True)装饰器并指定bind=True时,任务函数的第一个参数将自动绑定到任务实例本身,通常被命名为self。这意味着你可以在任务函数内部访问任务实例的属性和方法。 绑定任务实例对于某些特定的应用场景非常有用,例如当你需要在任务函数内部获取任务的元数据或控制任务执行行为时。通过绑定任务实例,你可以使用self.request属性访问任务的请求对象,其中包含了任务的元数据,如任务的唯一标识符、任务的参数等。
在Celery中,self.request是任务对象的一个属性,用于访问当前任务的请求对象。任务对象是通过@app.task装饰器创建的实例,它代表一个异步任务。 self.request属性是一个包含任务请求信息的对象,其中包括了任务的元数据和参数。在任务函数内部,你可以使用self.request来访问这些信息。 常见的self.request属性包括:
self.request.id:任务的唯一标识符,通常是一个UUID。self.request.args:任务的位置参数,以列表形式存储。self.request.kwargs:任务的关键字参数,以字典形式存储。self.request.delivery_info:任务的投递信息,包括消息的交换机、路由键等。self.request.hostname:执行任务的主机名。self.request.timestamp:任务的执行时间戳。self.request.expires:任务的过期时间。 通过访问self.request属性,你可以在任务函数内部获取任务的相关信息,例如任务的参数、执行时间等。这对于任务的处理逻辑或错误处理非常有用。 在上述代码中,print('Request: {0!r}'.format(self.request))语句用于打印任务的请求信息。 需要注意的是,self.request属性只在任务函数内部可用,如果在任务函数之外使用,将无法访问该属性。
2 @app.task和@shared_task的区别
@app.task和@shared_task都是用于将函数注册为Celery任务的装饰器,它们的使用和应用场景略有不同。
(1) @app.task装饰器:
用于将任务函数注册为属于特定Celery应用的任务。需要先创建一个Celery应用实例(例如app = Celery(...)),然后使用@app.task装饰器将任务函数注册到该应用实例上。这种方式适用于在单个应用中定义和调用任务函数,可以更精确地控制任务的配置和调度。
例如:
from celery import Celery
app = Celery('myapp', broker='redis://localhost:6379/0')
@app.task
def my_task():
# 任务逻辑
(2) @shared_task装饰器:
用于将任务函数注册为共享任务(shared task),可以被多个Celery应用调用。不需要先创建Celery应用实例,可以直接在任务函数上使用@shared_task装饰器注册任务。这种方式适用于多个应用共享任务的场景,例如在一个分布式系统中,多个应用需要调用同一个任务。
例如:
from celery import shared_task
@shared_task
def my_task():
# 任务逻辑
在使用@app.task和@shared_task时,需要确保已正确配置Celery应用的连接信息(例如消息队列的URL),以便任务能够被正确发送和执行。 选择使用@app.task还是@shared_task取决于具体的场景和需求。如果你只需要在单个应用中定义和调用任务函数,可以使用@app.task。如果需要多个应用共享任务函数,可以使用@shared_task。 需要注意的是,无论使用哪种装饰器,任务函数都需要在Celery应用的工作进程中执行。因此,在调用任务函数时,需要将任务消息发送到消息队列中,然后由工作进程来处理任务。