【问题标题】:Mutithreading in django when interactiong with database, what i need to know and pay attention to?django中与数据库交互时的多线程,我需要知道和注意什么?
【发布时间】:2016-10-06 08:03:05
【问题描述】:

我的网站需要定期解析来自多个网页的大量数据。我正在考虑使用 celery 或 python 线程来加快速度。

我害怕在与数据库交互时难以调试错误。 例如,当 2 个线程同时调用 SampleModel.object.get_or_create(name="same string") 时可能/会发生什么? 或者如果(简化伪代码来展示这个想法)会发生什么:

mymodel(models.Model)
      title = models.CharField()
      (...)
      owner = models.ManyToManyField(Creator)

def FindPageCreatorName(page):
    (...)
    return name

我会在多个线程中调用

def create_mymodel(url): #thats what will be run in each thread
    page = urllib.urlopen(url)
    mymodelInstance.title = FindPageTitle(page)
    (...)
    mymodelInstance.save()
    creator = Creator.get_or_create(name=FindPageCreatorName(page))
    mymodelInstance.creator.add(creator)

它会在大致相同的时间在多个页面上找到相同的创建者名称吗? (其他线程将在另一个指令之间更改数据库)

是否应该将每个线程封装在事务中,这样就足以防止错误?

还有哪些其他情况可能无法按预期工作? 或者我不应该担心,因为不会发生任何不好的事情,芹菜会处理这些事情?

如果您不能向我指出有关此主题的任何好的教程或文档,我将不胜感激。抱歉这个含糊不清的问题,但我不知道可能会出现什么具体问题——这就是问题所在。 此外,它可能是代码中唯一需要多线程的东西——在这种情况下我应该使用 celery 还是 python 线程? (芹菜不是大材小用吗?)

【问题讨论】:

    标签: python django database multithreading django-celery


    【解决方案1】:

    如果每秒有足够多的请求,肯定会发生坏事。

    如果两个线程同时调用SampleModel.object.get_or_create(name="same string") 会发生什么?如果有两个进程呢?如果被两个worker节点调用呢?

    在这种情况下,您需要考虑可能发生故障的位置。

    如果您有两个工作节点从 Celery 接受作业,并且如果这两个节点同时调用数据库操作,则 django 代码库中没有任何内容可以保证会发生什么。

    如果同一进程中的两个不同线程调用数据库操作,它们不能同时调用它,因为它们受到 CPU 访问的限制。

    但是如果你确实有多个节点,它们访问数据库,数据库本身会一个接一个地执行它们(有例外)。因此,在这种情况下,您要确保数据库拒绝第二个create 命令。根据数据库,这可以通过在相关字段上添加唯一索引来完成。

    如果您需要的话,您需要仔细考虑您的设计,并确保在数据库中写入顺序数据。在某些数据库中,并行数据写入将提供更好的性能,但不会提供数据完整性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 2013-01-02
      • 2013-04-11
      相关资源
      最近更新 更多