有人在做异步数据库提交吗?

2 投票
4 回答
1154 浏览
提问于 2025-04-17 08:15

我遇到的最耗时的逻辑基本上涉及两件事:发送电子邮件和把数据存入数据库。

有没有什么内置的机制可以让这些操作异步进行,这样就不会拖慢页面加载速度呢?

验证操作应该是同步进行的,但看起来发送邮件和写入数据库的效率最好是异步的。

举个例子,假设我想跟踪页面浏览量。每次我收到一个浏览时,我会这样做:

pv = PageView.objects.get(page = request.path)
pv.views = pv.views + 1
pv.save() # SLOWWWWWWWWWWWWWW

那么,想要通过让整个过程异步来加快速度,这样想是不是很自然呢?

4 个回答

0

你可以使用Python的线程池来处理数据库的写入操作。虽然全局解释器锁(GIL)会阻止Python线程同时工作,但这样做可以让你在写入还没完成之前,继续处理其他请求。

我在写入结果不影响响应显示的时候会用这种方法。

当然,如果你想发送请求并且希望返回一个201状态码,这样做就不是一个好习惯了。

0

我用这个方法来更新文本索引(这个过程比较慢),因为可以在后台进行。这样用户就能看到快速的响应时间:

    # create empty file
    dir=os.path.join(settings.DT.HOME, 'var', 'belege-changed')
    file=os.path.join(dir, str(self.id))
    fd=open(file, 'a') # like "touch" shell command
    fd.close()

一个定时任务每隔N分钟就会扫描这个目录,并更新文本索引。

在你的情况下,我会把请求的路径写入一个文件,然后在后台更新页面浏览模型。这样可以提高性能,因为你不需要每次都去数据库查询。

5

看看Celery吧。它提供了一种异步工作机制,可以把一些任务放到后台去处理,正好符合你提到的需求,比如发送邮件、统计页面浏览量等等。最开始它是专门为Django这个框架设计的,但现在也可以在其他环境中使用了。

撰写回答