【发布时间】:2016-11-18 15:39:29
【问题描述】:
这是我的项目设置,使用标准 Django startproject 命令和单个应用程序:
Python 3.5.1
Django 1.9.7
PostgreSQL 9.5.3
Ubuntu 16.04
应用的 models.py 定义了 2 个模型:
from django.db import models
class A(models.Model):
n = models.PositiveIntegerField(primary_key=True)
class B(models.Model):
a = models.ForeignKey(A, blank=True, null=True)
m = models.CharField(max_length=20, db_index=True)
class Meta:
unique_together = ('a', 'm')
def __str__(self):
return '%s' % self.m
这是我的名为 execute.py 的管理命令,用于创建 B 的实例:
from multiprocessing import Pool
from django import db
from django.core.management.base import BaseCommand
from .models import B
M = 'abcdef'
def create():
obj, created = B.objects.get_or_create(m=M, defaults={'a': None})
if created:
print('obj=%s' % obj)
class Command(BaseCommand):
def handle(self, *args, **kwargs):
B.objects.filter(m=M).delete()
db.connections.close_all()
n = 4
pool = Pool(processes=n)
results = []
for _ in range(n):
result = pool.apply_async(create)
results.append(result)
pool.close()
for result in results:
result.get()
pool.join()
运行 python manage.py execute 会导致创建 4 个 obj,而不仅仅是 1 个。但情况并非总是如此。有时,只创建了 3 个甚至 1 个对象:
obj=abcdef
obj=abcdef
obj=abcdef
obj=abcdef
我是否遗漏了一些东西来强制这里的唯一性?
【问题讨论】:
-
感谢您为我们提供了跟踪 As 和 Bs 的额外心理练习
标签: python django postgresql multiprocessing