<legend id='cHL0J'><style id='cHL0J'><dir id='cHL0J'><q id='cHL0J'></q></dir></style></legend>
  • <i id='cHL0J'><tr id='cHL0J'><dt id='cHL0J'><q id='cHL0J'><span id='cHL0J'><b id='cHL0J'><form id='cHL0J'><ins id='cHL0J'></ins><ul id='cHL0J'></ul><sub id='cHL0J'></sub></form><legend id='cHL0J'></legend><bdo id='cHL0J'><pre id='cHL0J'><center id='cHL0J'></center></pre></bdo></b><th id='cHL0J'></th></span></q></dt></tr></i><div id='cHL0J'><tfoot id='cHL0J'></tfoot><dl id='cHL0J'><fieldset id='cHL0J'></fieldset></dl></div>
    • <bdo id='cHL0J'></bdo><ul id='cHL0J'></ul>

    1. <small id='cHL0J'></small><noframes id='cHL0J'>

      1. <tfoot id='cHL0J'></tfoot>
      2. 芹菜/Redis同一任务被多次并行执行

        时间:2024-08-21
          <legend id='bpmLG'><style id='bpmLG'><dir id='bpmLG'><q id='bpmLG'></q></dir></style></legend>

          <tfoot id='bpmLG'></tfoot>

            • <bdo id='bpmLG'></bdo><ul id='bpmLG'></ul>
                  <tbody id='bpmLG'></tbody>
              1. <i id='bpmLG'><tr id='bpmLG'><dt id='bpmLG'><q id='bpmLG'><span id='bpmLG'><b id='bpmLG'><form id='bpmLG'><ins id='bpmLG'></ins><ul id='bpmLG'></ul><sub id='bpmLG'></sub></form><legend id='bpmLG'></legend><bdo id='bpmLG'><pre id='bpmLG'><center id='bpmLG'></center></pre></bdo></b><th id='bpmLG'></th></span></q></dt></tr></i><div id='bpmLG'><tfoot id='bpmLG'></tfoot><dl id='bpmLG'><fieldset id='bpmLG'></fieldset></dl></div>

                  <small id='bpmLG'></small><noframes id='bpmLG'>

                  本文介绍了芹菜/Redis同一任务被多次并行执行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我有两个自定义任务(TaskATaskB),它们都继承自celery.Task。调度程序时不时地启动TaskA,而TaskA每次启动NTaskB使用不同的参数。但由于某些原因,有时使用相同参数的相同TaskB会同时执行两次,这会导致数据库出现不同的问题。

                  class TaskA(celery.Task):
                  
                      def run(self, *args, **kwargs):
                          objects = MyModel.objects.filter(processed=False)
                                                   .values_list('id', flat=True)
                          task_b = TaskB()
                          for o in objects:
                              o.apply_async(args=[o, ])
                  
                  class TaskB(celery.Task):
                  
                      def run(self, obj_id, *args, **kwargs):
                          obj = MyModel.objects.get(id=obj_id)
                          # do some stuff with obj
                  

                  我尝试过的内容

                  我尝试使用celery.group,希望它能解决此类问题,但我得到的都是错误,说run接受2个参数,但没有提供任何参数。

                  这是我尝试使用celery.group启动TaskB的方式:

                  # somewhere in TaskA
                  task_b = TaskB()
                  g = celery.group([task_b.s(id) for id in objects])
                  g.apply_async()
                  

                  我也是这样试过的:

                  # somewhere in TaskA
                  task_b = TaskB()
                  g = celery.group([task_b.run(id) for id in objects])
                  g.apply_async()
                  

                  g.apply_async()之前执行任务的位置。

                  问题

                  问题是来自我启动任务的方式,还是其他原因?这是正常行为吗?

                  其他信息

                  在我的本地计算机上,我运行celery 3.1.13RabbitMQ 3.3.4,在服务器上运行celery 3.1.13Redis 2.8.9。 在本地机器上我看不到这样的行为,每个任务都执行一次。在服务器上,我看到1-10个这样的任务连续执行两次。

                  我在本地计算机和服务器上运行芹菜的方式如下:

                  celery_beat: celery -A proj beat -l info
                  
                  celery1: celery -A proj worker -Q default -l info --purge -n default_worker -P eventlet -c 50
                  
                  celery2: celery -A proj worker -Q long -l info --purge -n long_worker -P eventlet -c 200
                  

                  可行的解决方法

                  我根据它收到的参数在TaskB上引入了一个锁。经过大约10个小时的测试,我看到到底执行了两次什么,但是锁防止了数据库上的冲突。 这确实解决了我的问题,但我仍然想了解为什么会发生这种情况。

                  推荐答案

                  芹菜Using Redis文档中介绍的fanout_prefixfanout_patterns设置了吗?我正在和Redis一起使用芹菜,没有遇到此问题。

                  这篇关于芹菜/Redis同一任务被多次并行执行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:如何实现芹菜多工自动伸缩? 下一篇:使用__str__表示法打印容器中的对象

                  相关文章

                  <small id='SmInv'></small><noframes id='SmInv'>

                    <bdo id='SmInv'></bdo><ul id='SmInv'></ul>
                • <i id='SmInv'><tr id='SmInv'><dt id='SmInv'><q id='SmInv'><span id='SmInv'><b id='SmInv'><form id='SmInv'><ins id='SmInv'></ins><ul id='SmInv'></ul><sub id='SmInv'></sub></form><legend id='SmInv'></legend><bdo id='SmInv'><pre id='SmInv'><center id='SmInv'></center></pre></bdo></b><th id='SmInv'></th></span></q></dt></tr></i><div id='SmInv'><tfoot id='SmInv'></tfoot><dl id='SmInv'><fieldset id='SmInv'></fieldset></dl></div>

                    <tfoot id='SmInv'></tfoot>

                    1. <legend id='SmInv'><style id='SmInv'><dir id='SmInv'><q id='SmInv'></q></dir></style></legend>