Почему django-celery-beat не выполняет функцию?
worker: [2024-03-15 15:04:56,108: INFO/MainProcess] Connected to redis://127.0.0.1:6379// [2024-03-15 15:04:56,116: WARNING/MainProcess] C:UsershpdesktopjobvenvLibsite-packagesceleryworkerconsumerconsumer.py:507: CPendingDeprecationWarning: The broker_connection_retry configuration setting will no longer determine whether broker connection retries are made during startup in Celery 6.0 and above. If you wish to retain the existing behavior for retrying connections on startup, you should set broker_connection_retry_on_startup to True. warnings.warn( [2024-03-15 15:04:56,182: INFO/MainProcess] mingle: searching for neighbors [2024-03-15 15:04:57,103: INFO/SpawnPoolWorker-3] child process 2004 calling self.run() [2024-03-15 15:04:57,234: INFO/SpawnPoolWorker-1] child process 15900 calling self.run() [2024-03-15 15:04:57,243: INFO/SpawnPoolWorker-4] child process 14456 calling self.run() [2024-03-15 15:04:57,327: INFO/MainProcess] mingle: all alone [2024-03-15 15:04:57,391: INFO/SpawnPoolWorker-2] child process 3280 calling self.run() [2024-03-15 15:04:57,491: INFO/MainProcess] celery@LAPTOP-2554OM7H ready. [2024-03-15 15:04:57,505: INFO/MainProcess] Task products.services.import_data_from_xml[917a7e74-79d0-47dd-b857-c9cb5c37995d] received [2024-03-15 15:04:57,509: INFO/MainProcess] Task products.services.import_data_from_xml[5c056738-5974-4f3c-aed9-c824bf8bad0a] received [2024-03-15 15:05:03,554: INFO/SpawnPoolWorker-5] child process 18000 calling self.run() [2024-03-15 15:05:04,060: INFO/SpawnPoolWorker-6] child process 3016 calling self.run() [2024-03-15 15:09:00,978: INFO/MainProcess] Task products.services.import_data_from_xml[1496d6c4-06e2-4117-9571-22d5314eb4b5] received [2024-03-15 15:09:02,684: INFO/SpawnPoolWorker-7] child process 868 calling self.run() [2024-03-15 15:09:02,684: INFO/SpawnPoolWorker-8] child process 8588 calling self.run() [2024-03-15 15:09:02,684: INFO/SpawnPoolWorker-9] child process 9280 calling self.run() beat: (venv) PS C:Usershpdesktopjob> celery -A src beat -l info celery beat v5.3.6 (emerald-rush) is starting. __ - ... __ - _ LocalTime -> 2024-03-15 15:05:07 Configuration -> . broker -> redis://127.0.0.1:6379// . loader -> celery.loaders.app.AppLoader . scheduler -> django_celery_beat.schedulers.DatabaseScheduler . logfile -> [stderr]@%INFO . maxinterval -> 5.00 seconds (5s) [2024-03-15 15:05:07,522: INFO/MainProcess] beat: Starting... [2024-03-15 15:06:20,632: INFO/MainProcess] DatabaseScheduler: Schedule changed. [2024-03-15 15:06:36,583: INFO/MainProcess] DatabaseScheduler: Schedule changed. [2024-03-15 15:09:00,336: INFO/MainProcess] Scheduler: Sending due task xml_import (products.services.import_data_from_xml) celery==5.3.6 django-celery-beat==2.5.0 django-celery-results==2.5.1 redis==5.0.1 settings.py: INSTALLED_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", "bot_users.apps.BotUsersConfig", "products.apps.ProductsConfig", "categories.apps.CategoriesConfig", "commands.apps.CommandsConfig", "stories_news.apps.StoriesNewsConfig", "posts.apps.PostsConfig", "polls.apps.PollsConfig", "bot_statistics", "xml_import", "rest_framework", "nested_admin", "import_export", "ckeditor", "imagekit", "django_celery_beat", "django_celery_results", ] REDIS_HOST = '127.0.0.1' REDIS_PORT = '6379' CELERY_BROKER_URL = f'redis://{REDIS_HOST}:{REDIS_PORT}' CELERY_BROKER_BACKEND = f'redis://{REDIS_HOST}:{REDIS_PORT}' CELERY_RESULT_BACKEND = 'django-db' CELERY_BEAT_SCHEDULER='django_celery_beat.schedulers:DatabaseScheduler' CELERY_RESULT_EXTENDED = True celery.py: import os from celery import Celery # Set the default Django settings module for the 'celery' program. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'src.settings') app = Celery('src') # Using a string here means the worker doesn't have to serialize # the configuration object to child processes. # - namespace='CELERY' means all celery-related configuration keys # should have a `CELERY_` prefix. app.config_from_object('django.conf:settings', namespace='CELERY') # Load task modules from all registered Django apps. app.autodiscover_tasks() app/services.py: @app.task def import_data_from_xml(*args): from .admin import ProductResource from xml_import.models import XMLImportSettings from .formats import XML xml_settings = XMLImportSettings.objects.all().first() logging.info(f'xml_settings:{xml_settings}') folder_path = xml_settings.folder_path logging.info(f'folder_path:{folder_path}') file_name = xml_settings.file_name logging.info(f'file_name:{file_name}') # Полный путь к XML файлу xml_file_path = f"{folder_path}/{file_name}" logging.info(f'xml_file_path:{xml_file_path}') # Создаем экземпляр ресурса resource = ProductResource() logging.info(f'resource:{resource}') xml_formatter = XML() logging.info(f'xml_formatter:{xml_formatter}') with open(xml_file_path, 'r', encoding='utf-8') as xml_file: # Создаем dataset из XML данных data = xml_formatter.create_dataset(xml_file.read()) logging.info(f'data:{data}') # Импортируем данные из XML файла dataset = resource.import_data(dataset=data, raise_errors=True) logging.info(f'dataset:{dataset}') # Возвращаем результат импорта return dataset |
worker: [2024-03-15 15:04:56,108: INFO/MainProcess] Connected to redis://127.0.0.1:6379// [2024-03-15 15:04:56,116: WARNING/MainProcess] C:UsershpdesktopjobvenvLibsite-packagesceleryworkerconsumerconsumer.py:507: CPendingDeprecationWarning: The broker_connection_retry configuration setting will no longer determine whether broker connection retries are made during startup in Celery 6.0 and above. If you wish to retain the existing behavior for retrying connections on startup, you should set broker_connection_retry_on_startup to True. warnings.warn( [2024-03-15 15:04:56,182: INFO/MainProcess] mingle: searching for neighbors [2024-03-15 15:04:57,103: INFO/SpawnPoolWorker-3] child process 2004 calling self.run() [2024-03-15 15:04:57,234: INFO/SpawnPoolWorker-1] child process 15900 calling self.run() [2024-03-15 15:04:57,243: INFO/SpawnPoolWorker-4] child process 14456 calling self.run() [2024-03-15 15:04:57,327: INFO/MainProcess] mingle: all alone [2024-03-15 15:04:57,391: INFO/SpawnPoolWorker-2] child process 3280 calling self.run() [2024-03-15 15:04:57,491: INFO/MainProcess] celery@LAPTOP-2554OM7H ready. [2024-03-15 15:04:57,505: INFO/MainProcess] Task products.services.import_data_from_xml[917a7e74-79d0-47dd-b857-c9cb5c37995d] received [2024-03-15 15:04:57,509: INFO/MainProcess] Task products.services.import_data_from_xml[5c056738-5974-4f3c-aed9-c824bf8bad0a] received [2024-03-15 15:05:03,554: INFO/SpawnPoolWorker-5] child process 18000 calling self.run() [2024-03-15 15:05:04,060: INFO/SpawnPoolWorker-6] child process 3016 calling self.run() [2024-03-15 15:09:00,978: INFO/MainProcess] Task products.services.import_data_from_xml[1496d6c4-06e2-4117-9571-22d5314eb4b5] received [2024-03-15 15:09:02,684: INFO/SpawnPoolWorker-7] child process 868 calling self.run() [2024-03-15 15:09:02,684: INFO/SpawnPoolWorker-8] child process 8588 calling self.run() [2024-03-15 15:09:02,684: INFO/SpawnPoolWorker-9] child process 9280 calling self.run() beat: (venv) PS C:Usershpdesktopjob> celery -A src beat -l info celery beat v5.3.6 (emerald-rush) is starting. __ - ... __ - _ LocalTime -> 2024-03-15 15:05:07 Configuration -> . broker -> redis://127.0.0.1:6379// . loader -> celery.loaders.app.AppLoader . scheduler -> django_celery_beat.schedulers.DatabaseScheduler . logfile -> [stderr]@%INFO . maxinterval -> 5.00 seconds (5s) [2024-03-15 15:05:07,522: INFO/MainProcess] beat: Starting... [2024-03-15 15:06:20,632: INFO/MainProcess] DatabaseScheduler: Schedule changed. [2024-03-15 15:06:36,583: INFO/MainProcess] DatabaseScheduler: Schedule changed. [2024-03-15 15:09:00,336: INFO/MainProcess] Scheduler: Sending due task xml_import (products.services.import_data_from_xml) celery==5.3.6 django-celery-beat==2.5.0 django-celery-results==2.5.1 redis==5.0.1 settings.py: INSTALLED_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", "bot_users.apps.BotUsersConfig", "products.apps.ProductsConfig", "categories.apps.CategoriesConfig", "commands.apps.CommandsConfig", "stories_news.apps.StoriesNewsConfig", "posts.apps.PostsConfig", "polls.apps.PollsConfig", "bot_statistics", "xml_import", "rest_framework", "nested_admin", "import_export", "ckeditor", "imagekit", "django_celery_beat", "django_celery_results", ] REDIS_HOST = '127.0.0.1' REDIS_PORT = '6379' CELERY_BROKER_URL = f'redis://{REDIS_HOST}:{REDIS_PORT}' CELERY_BROKER_BACKEND = f'redis://{REDIS_HOST}:{REDIS_PORT}' CELERY_RESULT_BACKEND = 'django-db' CELERY_BEAT_SCHEDULER='django_celery_beat.schedulers:DatabaseScheduler' CELERY_RESULT_EXTENDED = True celery.py: import os from celery import Celery # Set the default Django settings module for the 'celery' program. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'src.settings') app = Celery('src') # Using a string here means the worker doesn't have to serialize # the configuration object to child processes. # - namespace='CELERY' means all celery-related configuration keys # should have a `CELERY_` prefix. app.config_from_object('django.conf:settings', namespace='CELERY') # Load task modules from all registered Django apps. app.autodiscover_tasks() app/services.py: @app.task def import_data_from_xml(*args): from .admin import ProductResource from xml_import.models import XMLImportSettings from .formats import XML xml_settings = XMLImportSettings.objects.all().first() logging.info(f'xml_settings:{xml_settings}') folder_path = xml_settings.folder_path logging.info(f'folder_path:{folder_path}') file_name = xml_settings.file_name logging.info(f'file_name:{file_name}') # Полный путь к XML файлу xml_file_path = f"{folder_path}/{file_name}" logging.info(f'xml_file_path:{xml_file_path}') # Создаем экземпляр ресурса resource = ProductResource() logging.info(f'resource:{resource}') xml_formatter = XML() logging.info(f'xml_formatter:{xml_formatter}') with open(xml_file_path, 'r', encoding='utf-8') as xml_file: # Создаем dataset из XML данных data = xml_formatter.create_dataset(xml_file.read()) logging.info(f'data:{data}') # Импортируем данные из XML файла dataset = resource.import_data(dataset=data, raise_errors=True) logging.info(f'dataset:{dataset}') # Возвращаем результат импорта return dataset
Дополнительно:
закинуть весь код в один тег - сильно конечно.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Проблема с django-celery-beat, когда он не выполняет функцию, может быть вызвана несколькими причинами. Вот несколько возможных причин и способы их решения:
1. Неправильная конфигурация Celery Beat: Убедитесь, что вы правильно skonfigurowali django-celery-beat в вашем проекте. Проверьте файл настроек settings.py и убедитесь, что все параметры настроены правильно.
CELERY_BEAT_SCHEDULE = { 'task_name': { 'task': 'path.to.task', 'schedule': timedelta(seconds=60), }, }
2. Проблемы с Celery Worker: Убедитесь, что ваш Celery Worker запущен и работает правильно. Вы можете проверить статус Celery Worker с помощью команды:
celery -A project_name worker --loglevel=info
3. Неправильная настройка времени выполнения задач: Убедитесь, что время выполнения задачи в настройках Celery Beat правильно настроено. Проверьте, что параметр 'schedule' указывает на правильное время выполнения задачи.
4. Проблемы с зависимостями: Убедитесь, что у вас установлены все необходимые зависимости для django-celery-beat. Вы можете убедиться, что все зависимости установлены с помощью команды:
pip freeze
Если после выполнения этих шагов проблема с django-celery-beat все еще не решена, попробуйте перезапустить сервер и Celery Worker, а также проверьте журналы ошибок для получения дополнительной информации о возможных причинах проблемы. Если проблема все еще не решена, обратитесь к документации по django-celery-beat или задайте вопрос на форуме сообщества, чтобы получить дополнительную помощь.