使用芹菜任务从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-can-i-do:
MySQL的默认隔离级别设置为REPEATABLE-READ,如果您确实不需要,则将其设置为READ-COMMITTED。您可以通过在my.cnf中添加以下内容来实现:
[mysqld] transaction-isolation = READ-COMMITTED
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句