Django中的多线程在与数据库交互时,我需要知道和注意什么?

2024-10-01 04:44:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我害怕在与数据库交互时出现难以调试的错误。 例如,当两个线程同时调用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)

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

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

还有哪些场景可能无法按预期工作? 或者我不应该担心,因为没有什么不好的事情会发生,芹菜会处理这些事情吗

如果你不能告诉我关于这个主题的任何好的教程或文档,我将不胜感激。很抱歉问了这么模糊的问题,但我不知道会出现什么具体问题——这就是问题所在。 而且,它可能是代码中唯一需要多线程的东西——在这种情况下,我应该使用芹菜线程还是python线程(芹菜不是杀伤力很大吗?)


Tags: or代码name数据库getmodels错误create
1条回答
网友
1楼 · 发布于 2024-10-01 04:44:41

如果每秒有足够的请求,那么肯定会发生糟糕的事情

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

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

如果有两个worker节点从芹菜中接受作业,并且这两个节点同时调用数据库操作,那么django代码库中没有任何东西可以保证会发生什么

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

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

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

相关问题 更多 >