Celery Deadlock在Django中保存数据时,为什么?

普罗米修斯

使用芹菜任务从CSV保存新客户出现死锁这是我到目前为止的工作。

  for line in csv.reader(instance.data_file.read().splitlines()):
        for index, item in enumerate(line):
            number = int(item)
            # TODO: Turn into task
            Customer.objects.create_customer(
                mobile=number,
                campaign=instance.campaign,
                reward_group=instance.reward_group,
                company=instance.company,
            )

没有错误。

但是,将相同的代码添加到Celery任务时,出现以下错误...

尝试获取锁定时发现死锁;尝试重新开始交易”

因此,这使我相信这里的芹菜装置做错了。谁能发现什么?

这是出现死锁错误的新Celery任务。我正在使用shared_task这些任务,因为它们有时会在没有Django的其他计算机上运行,​​但这暂时不重要。

CSV导入的第一行正常,然后出现死锁错误...

for line in csv.reader(instance.data_file.read().splitlines()):
    for index, item in enumerate(line):
        number = int(item)
        celery_app.send_task('test.tasks.create_customer_from_import', args=[number, instance.id], kwargs={})

task.py

# Python imports
from __future__ import absolute_import

# Core Django imports
from celery import shared_task

from mgm.core.celery import app as celery_app

@shared_task
def create_customer_from_import(number, customer_upload_id):
    customer_upload = CustomerUpload.objects.get(pk=customer_upload_id)
    new_customer = Customer.objects.create_customer(
        mobile=number,
        campaign=customer_upload.campaign,
        reward_group=customer_upload.reward_group,
        company=customer_upload.company,
    )
    return new_customer

芹菜

from __future__ import absolute_import

import os

from celery import Celery

from django.conf import settings

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test.settings')

app = Celery('test-tasks')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

这是CustomerManager:

class CustomerManager(models.Manager):
    def create_customer(self, mobile, campaign, reward_group, company, password=None):.
        user = AppUser.objects.create_user(mobile=mobile)
        # Creates a new customer for a company and campaign
        customer = self.model(
            user=user,
            campaign=campaign,
            reward_group=reward_group,
            company=company
        )

        customer.save(using=self._db)
公爵

您的代码看起来没有错,但是由于多个芹菜工人的并发,您可能陷入僵局。来自http://celery.readthedocs.org/en/latest/faq.html#mysql-is-throwing-deadlock-errors-what-c​​an-i-do

MySQL的默认隔离级别设置为REPEATABLE-READ,如果您确实不需要,则将其设置为READ-COMMITTED。您可以通过在my.cnf中添加以下内容来实现:

[mysqld]
transaction-isolation = READ-COMMITTED

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Django Celery Persistent撤销

来自分类Dev

使用RabbitMQ的Django Celery

来自分类Dev

django celery击败了DBAccessError

来自分类Dev

Django Celery任务记录

来自分类Dev

Django 和 Celery 任务

来自分类Dev

Django 2.2的django-celery vs django-celery-beat

来自分类Dev

测试Django和Celery结合

来自分类Dev

Django Celery设置导入问题

来自分类Dev

Celery和Django简单示例

来自分类Dev

Celery / django重复键冲突

来自分类Dev

加载时运行Django celery

来自分类Dev

用celery部署Django项目

来自分类Dev

Celery / django重复键冲突

来自分类Dev

使用 Celery 调度 Django 方法

来自分类Dev

Celery 'FAILURE' 的附加元数据

来自分类Dev

使用'pip install celery'在ubuntu上安装celery时出错

来自分类Dev

运行django celery时出现分段错误

来自分类Dev

Django,RabbitMQ和Celery-在更新开发中的Django代码后,为什么Celery运行旧版本的任务?

来自分类Dev

使用Celery和Gino保存对象

来自分类Dev

Celery在python中有什么用?

来自分类Dev

从Supervisor停止Celery worker时出现WorkerLostError

来自分类Dev

Celery:自动启动Worker(在启动时)

来自分类Dev

从 Celery 发送消息时出现 ActiveMQ 异常

来自分类Dev

Celery 有时不创建任务

来自分类Dev

Django / Python中的Celery任务最佳做法

来自分类Dev

重置Django密码-使用celery发送邮件

来自分类Dev

没有Celery的Django中的预定任务?

来自分类Dev

通过名称调用Django celery任务

来自分类Dev

Django中的Celery任务总是阻塞