这是定义 celery 应用程序的文件:
from celery import Celery
from constants import TASKS_FILE_NAMES
celery_app = Celery('tasks', backend='rpc://', broker='pyamqp://guest@localhost//')
for filename in TASKS_FILE_NAMES:
print(filename)
celery_app.autodiscover_tasks(['units'], related_name=filename[:-3], force=True)
并且同一个包中有constants.py:
import os
TASKS_DIR = os.path.join(os.getcwd(), "units")
TASKS_FILE_NAMES = [file for file in os.listdir(TASKS_DIR) if os.path.isfile(os.path.join(TASKS_DIR, file)) and file != '__init__.py']
我在该包内还有
/units
文件夹,其中包含任务所在的文件。
当我使用
celery --app celeryapp worker --loglevel=INFO
命令运行 celery 时,文件名会打印两次。事实上,我尝试过的所有内容都被打印了两次,就好像文件被执行了两次一样。什么会导致这种行为?
这是因为当您导入某些内容时,整个代码都会被执行。
import os
if __name__ == '__main__':
TASKS_DIR = os.path.join(os.getcwd(), "units")
TASKS_FILE_NAMES = [file for file in os.listdir(TASKS_DIR) if os.path.isfile(os.path.join(TASKS_DIR, file)) and file != '__init__.py']
试试这个,它检查调用脚本是否是主脚本(主要指的是脚本本身)。如果直接执行代码,它就是main。如果被其他脚本导入并调用,它会改变