【问题标题】:How create task with celery in django? POO issue?如何在 Django 中用芹菜创建任务?便便问题?
【发布时间】:2023-02-09 01:57:44
【问题描述】:

我正在尝试使用 Django 和 Celery 设置任务。 Celery 和 Django 配置没问题,这方面没有什么可报告的。但是,我认为在 OOP 中编写代码时遇到问题。我找不到问题出在哪里。这是一个参数问题,delay() 需要 4 个参数,但我的方法只需要 3 个。这是文件和我尝试执行的操作,以及错误跟踪。

我的文件

助手.py

我想为run_test_optimization method创建一个任务

class MachineLearniaXHelpers(MagicModels):
    def __init__(self, data_dict, target_name, type_model, test_size = 0.33, random_state = 42, **kwargs) -> None:
        super().__init__()
        self.test_size = test_size
        self.random_state = random_state
        self.process = DataProcessor(
            data=data_dict,
            target_name=target_name
        )
        self.metrics = MetricsScorer(type_model=type_model)
        self.model = self.several_algorythme(type_model, **kwargs)
    
    @staticmethod
    def split_data(data_dict):
        return train_test_split(*data_dict)
        
    @staticmethod   
    def train_model(model, X, y):
        model.fit(X, y)
    
    def run_test_optimization(self):
        dict_result = []
        for model in self.model:
            feature_model, values = self.process.transform_dict_to_array_structure()
            x_train, x_test, y_train, y_test = self.split_data(values)
            self.train_model(model, x_train, y_train)
            dict_metrics_train = self.metrics.choice_metrics_by_type_model(y_train, model.predict(x_train))
            dict_metrics_test = self.metrics.choice_metrics_by_type_model(y_test, model.predict(x_test))
            dict_result.append({
                "name_model" : model.__class__.__name__,
                "features_model" : feature_model,
                "train_performances" : dict_metrics_train,
                "test_performances" : dict_metrics_test
            })
        return dict_result

任务.py

创建我的任务task_run_test_optimization

from celery import shared_task
from .helpers import MachineLearniaXHelpers

@shared_task
def task_run_test_optimization(data_dict, target_name, type_model):
    constructor = MachineLearniaXHelpers(
        data_dict,
        target_name,
        type_model
        )
    dict_result = constructor.run_test_optimization()
    return dict_result

视图.py

API post方法,task方法在这里task_run_test_optimization

class MachineLearningXView(APIView):
    serializer_class = BuildModelMLSerializer
    permission_classes = [IsAuthenticated, UserPermissionMachineLearniaX]


    def post(self, request):
        if not self.request.session.exists(self.request.session.session_key):
            self.request.session.create()
        
        serializer = self.serializer_class(data=request.data)
        if serializer.is_valid():
            data = request.data.get('data')
            target = serializer.data.get('target_name')
            type_model = serializer.data.get('test_type')
            result = task_run_test_optimization.delay(data, target, type_model) # probleme is here
            print(result)
            return Response(status=status.HTTP_200_OK)

结果在我的控制台中向我发送了一个 id,post 请求没问题:

System check identified no issues (0 silenced).
February 08, 2023 - 17:25:28
Django version 4.1.5, using settings 'ialab.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
829e66ee-925f-4aff-8c42-49420e5758ce <-- PRINT result IS HERE
[08/Feb/2023 17:25:47] "POST /api/machinelearniax HTTP/1.1" 200 0

但是在我的芹菜工人中,我有这个错误:

[2023-02-08 17:25:47,813: INFO/MainProcess] Task api.tasks.task_run_test_optimization[829e66ee-925f-4aff-8c42-49420e5758ce] received
[2023-02-08 17:25:47,897: ERROR/MainProcess] Task api.tasks.task_run_test_optimization[829e66ee-925f-4aff-8c42-49420e5758ce] raised unexpected: TypeError('task_run_test_optimization() takes 3 positional arguments but 4 were given')
Traceback (most recent call last):
  File "C:\Users\basti\Desktop\IALab\ialab\.ialabenv\lib\site-packages\celery\app\trace.py", line 451, in trace_task
    R = retval = fun(*args, **kwargs)
  File "C:\Users\basti\Desktop\IALab\ialab\.ialabenv\lib\site-packages\celery\app\trace.py", line 734, in __protected_call__
    return self.run(*args, **kwargs)
TypeError: task_run_test_optimization() takes 3 positional arguments but 4 were given

任务已收到但无法正常工作。

我的错误在哪里?

【问题讨论】:

    标签: python django oop celery django-celery


    【解决方案1】:

    可能的情况和解决方案#1。

    您最初可能让 task_run_test_optimization 接受 4 个参数。您已经运行了 Celery,它将此任务及其签名加载到内存中。

    那么你可能已经改变了task_run_test_optimization 签名来接受 3 个参数,但是你忘记了重新加载芹菜.结果,您尝试使用 3 个参数调用任务,但 Celery 仍然保留旧版本的任务(具有 4 个参数的任务)。

    可能的情况和解决方案#2:

    也许您有 2 个不同的任务,名称相同:“task_run_test_optimization”,而您的 views.py 导入了错误的任务?确保导入正确的。

    【讨论】:

    • 感谢您的回复,案例1解决了问题。我接受这个答案。
    猜你喜欢
    • 2015-01-20
    • 2021-05-30
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 2021-10-12
    • 2011-05-31
    • 2019-06-12
    相关资源
    最近更新 更多