Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.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_Flower - Fatal编程技术网

Python 芹菜任务是什么意思;收到“;?当所有芹菜工人都被阻止时,新的任务发生了什么;收到“;?

Python 芹菜任务是什么意思;收到“;?当所有芹菜工人都被阻止时,新的任务发生了什么;收到“;?,python,celery,flower,Python,Celery,Flower,我正在开发一个新的监控系统,该系统可以测量芹菜队列吞吐量,并在队列备份时帮助提醒团队。在我的工作过程中,我遇到了一些我不理解的特殊行为(在芹菜规范中也没有很好的记录) 出于测试目的,我设置了一个端点,该端点将使用几个长时间运行的任务填充队列,这些任务可用于模拟备份队列。框架是Flask,队列代理是Redis。芹菜是为每个工人配置的,可以并行处理多达4个任务,我有2个工人在运行 api/health.py def health(): health = Blueprint("hea

我正在开发一个新的监控系统,该系统可以测量芹菜队列吞吐量,并在队列备份时帮助提醒团队。在我的工作过程中,我遇到了一些我不理解的特殊行为(在芹菜规范中也没有很好的记录)

出于测试目的,我设置了一个端点,该端点将使用几个长时间运行的任务填充队列,这些任务可用于模拟备份队列。框架是Flask,队列代理是Redis。芹菜是为每个工人配置的,可以并行处理多达4个任务,我有2个工人在运行

api/health.py

def health():
    health = Blueprint("health", __name__)

    @health.route("/api/debug/create-long-queue", methods=["GET"])
    def long_queue():
        for i in range(16):
            sleepy_job.delay()

        return make_response({}, 200)

    return health
@celery.task(priority=HIGH_PRIORITY)
def sleepy_job(*args, **kwargs):
    time.sleep(30)
jobs.py

def health():
    health = Blueprint("health", __name__)

    @health.route("/api/debug/create-long-queue", methods=["GET"])
    def long_queue():
        for i in range(16):
            sleepy_job.delay()

        return make_response({}, 200)

    return health
@celery.task(priority=HIGH_PRIORITY)
def sleepy_job(*args, **kwargs):
    time.sleep(30)
下面是我模拟备份生产队列的步骤:

  • 我调用
    /api/debug/create long queue
    来模拟队列中的备份。根据上述数学,工人们应该每个忙着睡1分钟(加在一起,他们一次可以同时处理8项任务,每个任务只睡30秒,总共有16项任务)
  • 在(<5s)之后不久,我进行了另一个API调用,这将启动一个具有真实业务逻辑的不同作业(处理入站webhook API调用)。我们将调用此作业处理传入消息
  • 下面是我使用flower检查队列时看到的内容:

    • 虽然所有工作人员都被前8个
      sleepy\u作业
      任务阻止,但我在队列上没有看到新的
      handle\u incoming\u消息
      的迹象,即使我确定
      handle\u incoming\u message.delay()
      已作为第二次API调用的结果被调用
    • 在前8个
      sleepy_作业
      任务完成后(~30秒),我在队列上看到新的
      handle_incoming_消息
      ,状态为
      received
    • 在第二个(也是最后一个)8
      sleepy_作业
      任务完成后,我现在看到
      handle_incoming_message
      的状态已启动(我可以确认这一点,因为UI将使用该任务中接收和处理的新数据进行更新。)
    问题 因此,很明显,当工人在处理前8个
    睡眠作业
    任务后暂时解锁时,他们正在以flower可见的方式标记/确认新的
    处理传入消息
    任务但这留下了几个悬而未决的问题:

    • 当工作进程被阻止时,新的
      处理传入消息
      任务的状态是什么
    • 解除阻止工作进程后发生了哪些变化,使得flower现在可以看到新的
      处理传入消息
      任务
    • “接收”状态实际上是什么意思
    • (额外好处:在阻止工作人员时,如何查看排队的任务?)
  • 当所有工作进程都被阻止时,由于预取,某些任务可能处于已接收状态(请查阅文档中的相关信息)。因此,很有可能您的任务只是在队列中,等待芹菜工人接收(协调过程-这些不是实际的工人过程)

  • Flower是一个简单的服务,它建立在芹菜的“任务事件”特性之上。简单地说,它(Flower)将自己订阅为所有事件(接收、成功、启动、失败等)的接收者,然后将这些事件可视化地表示给web客户端。所以,当芹菜工人接收到任务时,会发送一个“TaskReceived”事件。Flower获取此事件,并在仪表板中更改该任务的状态

  • 当一个任务被“接收”时,这意味着特定的芹菜工人将该任务从队列中移除,并且可以立即执行该任务(如果有空闲的工人进程来执行它),或者芹菜工人将等待工人进程准备好运行该任务。我已经提到过预取-芹菜工人通常会比可用的工人进程承担更多的任务

  • 芹菜并没有为用户提供一种列出特定队列中的内容的方法。这就是为什么你会看到许多类似的问题——包括。你会在那里看到我的简短回答。简而言之,这取决于你选择的经纪人。如果是Redis,则只需浏览对象列表即可。如果是RabbitMQ,则可以使用其工具检查队列。我认为不提供这一信息的决定是好的,因为这一信息永远不可靠。当您列出特定队列中的所有任务时,可能会有数千个新任务


  • 非常感谢Dejan,这非常有用。鉴于这些限制,端到端芹菜队列监控(更重要的是警报)的最佳实践是什么?例如,我希望在从
    .delay()
    到任务成功的平均时间大于30秒时收到通知。(我知道我们经常会超过这一限制,而我认为分类的第一步是至少知道它何时发生。)[我阅读了链接帖子,但似乎没有任何一种解决方案脱颖而出。在这方面真的没有行业标准吗?对许多公司来说,这似乎是一个大问题。]在我工作的公司,我们自己编写了通知系统,它基于我在关于花卉的一段中提到的相同的监控机制。。。