我的项目目录结构如下:

rss_reader
 - reader
    - __init__.py
    - models.py
    - views.py
    - ...
 - rss_reader
    - __init__.py
    - settings.py
    - urls.py
    - wsgi.py
 - rss_contents
    - __init__.py
    - celery.py
    - tasks.py
    - config.py
 - ...


task.py

from __future__ import absolute_import
from rss_contents.celery import app

@app.task
def processArticle():
    print "100"


芹菜

from __future__ import absolute_import
from celery import Celery

app = Celery('rss_contents', include=['rss_contents.tasks'])
app.config_from_object('rss_contents.config')


config.py

from __future__ import absolute_import

CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/5'
BROKER_URL = 'redis://127.0.0.1:6379/6'


阅读器> __init__.py

from rss_contents import tasks
tasks.processArticle.delay()




我的步骤如下:


芹菜-rss_contents工作者-l信息


控制台显示:

[2017-01-11 10:34:33,829: INFO/MainProcess] Connected to redis://127.0.0.1:6379/6
[2017-01-11 10:34:33,855: INFO/MainProcess] mingle: searching for neighbors
[2017-01-11 10:34:34,861: INFO/MainProcess] mingle: all alone
[2017-01-11 10:34:34,892: WARNING/MainProcess] celery@DESKTOP-6KAT7MF ready.



运行服务器,在http://127.0.0.1:8000/处启动开发服务器


但是celery控制台显示任务已运行两次:

[2017-01-11 10:41:20,910: INFO/MainProcess] Received task: rss_contents.tasks.processArticle[aa355c77-4ee8-4208-9e8c-915b110c7bbd]
[2017-01-11 10:41:20,911: WARNING/Worker-1] 100
[2017-01-11 10:41:20,917: INFO/MainProcess] Task rss_contents.tasks.processArticle[aa355c77-4ee8-4208-9e8c-915b110c7bbd] succeeded in 0.00600004196167s: None

[2017-01-11 10:41:22,430: INFO/MainProcess] Received task: rss_contents.tasks.processArticle[d92a151c-f0f9-4e8f-921a-fff2c1eb64c6]
[2017-01-11 10:41:22,431: WARNING/Worker-1] 100
[2017-01-11 10:41:22,447: INFO/MainProcess] Task rss_contents.tasks.processArticle[d92a151c-f0f9-4e8f-921a-fff2c1eb64c6] succeeded in 0.0160000324249s: None


为什么要运行两次?我该怎么办一次?

提前致谢。

最佳答案

@enix将其钉在头上。由于reader是一个应用程序,因此在django初始化应用程序注册表时会调用一次。但是,由于此调用是动态进行的,因此读取器应用可能会第二次初始化,因为某个地方存在全局使用读取器包的情况。无论如何,解决此问题的最简单方法是将您的调用移至一个类,并从任何python文件的单例调用它。

class AppInitializer(object):
    initialized = false

    @classmethod
    def initialize(cls):
        if not cls.initialized:
            cls.initialized = True
            from rss_contents import tasks
            tasks.processArticle.delay()

AppInitializer.initialize()


如果您的应用程序引擎是多线程的,则需要在initialize周围添加方法锁。

关于python - Django Celery任务运行两次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41582064/

10-12 16:50
查看更多