请原谅我的无知,因为我正在学习如何将芹菜用于我的目的。
假设我有两个任务:create_ticket
和add_message_to_ticket
。通常create_ticket
任务是在多次创建add_message_to_ticket
任务之前创建和完成的。
@app.task
def create_ticket(ticket_id):
time.sleep(random.uniform(1.0, 4.0)) # replace with code that processes ticket creation
return f"Successfully processed ticket creation: {ticket_id}"
@app.task
def add_message_to_ticket(ticket_id, who, when, message_contents):
# TODO add code that checks to see if create_ticket task for ticket_id has already been completed
time.sleep(random.uniform(1.0, 4.0)) # replace with code that handles added message
return f"Successfully processed message for ticket {ticket_id} by {who} at {when}"
现在,由于Python的服务器从外部Web服务无序接收事件,因此假设这些任务是无序创建的。例如,一个add_message_to_ticket.delay(82, "auroranil", 1599039427, "This issue also occurs on Microsoft Edge on Windows 10.")
在被调用create_ticket.delay(82)
之前几秒钟被调用。我该如何解决以下问题?
create_ticket
中指定ticket_id来获取芹菜任务add_message_to_ticket
的结果?我能想到的就是维护一个存储票证状态的数据库,并检查是否已创建特定票证,但是我想知道我是否能够以某种方式使用celery的结果后端。add_message_to_ticket
任务,发现对应的工单尚未完成create_ticket
任务,我是否会拒绝该任务并将其放回队列中? / li>
ticket_id
。如果接收到某个特定故障单的多个用户消息时时间戳不正确,我并不特别担心,因为这与在将消息添加到该故障单之前知道已创建故障单并不重要。我要说的是,我正在编写一些任务,其中某些事件严重依赖于其他事件,而其他事件的顺序对Python服务器的功能并没有多大影响。
task_id
来标识Celery任务,其格式字符串包含标识该任务的参数值。例如,task_id="create_ticket(\"TICKET000001\")"
task_id?
发送一次任务,例如,我希望create_ticket
任务仅异步应用一次。这是使所有任务成为幂等的替代方法。AsyncResult
中的add_message_to_ticket
检查create_ticket
任务的状态?即使第一个任务可能已经完成,也可以以某种方式指定一条链吗?