我正在开发一个 Django 应用程序本地,它需要将 CSV 文件作为输入并对文件运行一些分析。 我在本地运行 Celery、RabbitMQ 和 Web 服务器。 当我导入文件时,我在 Celery 服务器上看到以下错误:
[2015-12-11 16:58:53,906: WARNING/MainProcess] celery@Joes-MBP ready.
[2015-12-11 16:59:11,068: ERROR/MainProcess] Task program_manager.tasks.analyze_list_import_program[db22de16-b92f-4220-b2bd-5accf484c99a] raised unexpected: WorkerLostError('Worker exited prematurely: signal 11 (SIGSEGV).',)
Traceback (most recent call last):
File "/Users/joefusaro/rl_proto2/venv/lib/python2.7/site-packages/billiard/pool.py", line 1175, in mark_as_worker_lost
human_status(exitcode)),
WorkerLostError: Worker exited prematurely: signal 11 (SIGSEGV).
我不知道如何进一步解决这个问题;如果有帮助的话,我已经从program_manager/tasks.py复制了相关代码:
from __future__ import absolute_import
import csv
import rollbar
from celery import shared_task
from celery.utils.log import get_task_logger
from qscore.models import QualityScore
from integrations.salesforce.prepare import read_csv
from qscore.quality_score import QualityScoreCalculator
logger = get_task_logger(__name__)
@shared_task
def analyze_list_import_program(program):
program.status = 'RUN'
program.save()
df = read_csv(program.csv_file.file)
try:
qs = program.get_current_quality_score()
qs_calc = QualityScoreCalculator(df, qs)
qscore_data = qs_calc.calculate()
QualityScore.objects.filter(id=qs.id).update(**qscore_data)
except Exception as e:
rollbar.report_exc_info()
program.status = 'ERROR'
else:
program.status = 'COMPL'
finally:
program.save()
这可以通过在各个任务函数中导入 python 包来解决,而不是在tasks.py的顶部。
我已经删除了在tasks.py文件顶部导入的所有包,除了从.celery导入应用程序
from <project>.celery import app
,然后在各个任务函数中导入包。它成功了!
只是将我的部分添加到此-
我收到了一个非常相似的问题。 但是当我从基于 Intel 的芯片切换到 Apple Silicon M1 芯片时,我的问题出现了。
这是我为使我的系统正常工作所做的事情 -
Dockerfile
的变化 -
(添加--platform=linux/amd64)
FROM --platform=linux/amd64 <base_image>
改变
docker-compose.yml
-
(添加平台:linux/amd64)
db:
image: postgres:12-alpine
platform: linux/amd64
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
ports:
- 5435:5432
参考 - https://www.reddit.com/r/django/comments/o43k2b/developing_django_on_apple_m1/
问题是您的 Celery 任务正在尝试取消/反序列化实际的 Django 对象
program
。将 program_id
作为参数传递给您的任务,并在任务本身中重新获取对象。
我遇到了同样的问题,并设法使用线程池继续。
例如:
celery -A app worker --loglevel=info --pool threads
此方法适合调试目的。您可能需要更深入地了解工作人员正在执行的任务