有人在做异步数据库提交吗?
我遇到的最耗时的逻辑基本上涉及两件事:发送电子邮件和把数据存入数据库。
有没有什么内置的机制可以让这些操作异步进行,这样就不会拖慢页面加载速度呢?
验证操作应该是同步进行的,但看起来发送邮件和写入数据库的效率最好是异步的。
举个例子,假设我想跟踪页面浏览量。每次我收到一个浏览时,我会这样做:
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这个框架设计的,但现在也可以在其他环境中使用了。