芹菜 - “WorkerLostError:工作程序过早退出:信号11(SIGSEGV)”

10

我正在本地开发一个基于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()

我真的怀疑这与celery无关。Signal 11表示分段错误。尝试单独执行代码以隔离问题。您可以在此处阅读有关分段错误的更多信息http://www.cyberciti.biz/tips/segmentation-fault-on-linux-unix.html。 - station
3个回答

2

我来补充一下 -

我遇到了非常类似的问题。 但我的问题是在从Intel芯片切换到Apple Silicon M1芯片时出现的。

以下是我所做的使系统正常工作的步骤 - 更改Dockerfile - (添加--platform=linux/amd64)

FROM --platform=linux/amd64 <base_image>

docker-compose.yml 中进行更改 - (添加 platform: 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/


2

可以通过在单个任务函数中导入Python包来解决此问题,而不是在tasks.py文件顶部导入。

我已经删除了在tasks.py文件顶部导入的所有包,除了从.celery中导入app from <project>.celery import app,然后在单个任务函数中导入包。它起作用了!


0
问题在于您的 Celery 任务试图反序列化 Django 对象 program。将 program_id 作为参数传递给您的任务,并在任务本身中重新获取对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接