【问题标题】:Async run script from "python manage.py shell"?来自“python manage.py shell”的异步运行脚本?
【发布时间】:2021-10-02 02:26:16
【问题描述】:

据我所知,从python manage.py shellpython manage.py shell < import.py 这样运行脚本是同步完成的:

# models.py
class PersonManager(models.Manager):
    def generate_num_children(self, persons):
        for person in persons:
            person.generate_num_children()


class ParentManager(models.Manager):
    def generate_num_grandchildren(self, parents):
        for parent in parents:
            parent.generate_num_grandchildren()


class Person(models.Model):
    objects = PersonManager()
    num_children = models.IntegerField(default=0)
    parent = models.ForeignKey(related_name="children")

    def generate_num_children(self):
        self.num_children = 1
        self.save()


class Parent(models.Model):
    objects = ParentManager()
    num_grandchildren = models.IntegerField()

    def generate_num_grandchildren(self):
        num = 0       
        for child in self.children.all():
            num += child.num_children
        self.num_grandchildren = num
        self.save()
    
# import.py
parent = Parent.objects.create(id=1)

person1 = Person.objects.create(id=2, parent=parent)
person2 = Person.objects.create(id=3, parent=parent)
person3 = Person.objects.create(id=4, parent=parent)

persons = Person.objects.all()
Person.objects.generate_num_children(persons)

parent.generate_num_grandchildren()

# python manage.py shell
Parent.objects.get(id=1).num_grandchildren # Returns 0

但是,当我在 python manage.py shelltest 文件中单独输入每一行时,代码会异步运行并给出正确的结果:

parent = Parent.objects.create(id=1)
person1 = Person.objects.create(id=2, parent=parent)
person2 = Person.objects.create(id=3, parent=parent)
person3 = Person.objects.create(id=4, parent=parent)

persons = Person.objects.all()
Person.objects.generate_num_children(persons)

parent.generate_num_grandchildren()

Parent.objects.get(id=1).num_grandchildren # Returns 3

那么我怎样才能使我的import.py 文件异步呢?

# import.py
# Run first
parent = Parent.objects.create(id=1)

person1 = Person.objects.create(id=2, parent=parent)
person2 = Person.objects.create(id=3, parent=parent)
person3 = Person.objects.create(id=4, parent=parent)

persons = Person.objects.all()
Person.objects.generate_num_children(persons)

# Run only when previous section is complete
parent.generate_num_grandchildren()

【问题讨论】:

    标签: python django shell


    【解决方案1】:

    Django shell 脚本是普通的 Python,因此您可以使用任何内置功能在 Python 中运行异步代码:

    • 线程
    • 流程
    • 异步

    或者你可以使用像 Celery 这样的任务队列系统。

    如果您还没有在您的网站上使用像 Celery 这样的东西,我建议您查看线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 2011-09-16
      • 2014-09-19
      • 1970-01-01
      • 2011-06-18
      • 2019-05-11
      • 1970-01-01
      相关资源
      最近更新 更多