【发布时间】: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