我遇到的大多数最长(最耗时)的逻辑基本上涉及两件事:发送电子邮件和将项目提交到数据库。
是否有任何内置机制可以异步执行这些操作,以免减慢页面加载速度?
验证应该同步处理,但实际上,通过电子邮件发送和写入数据库的最佳方式应该是异步的。
例如,假设我要跟踪综合浏览量。因此,每次我得到一个观点,我都会这样做:
pv = PageView.objects.get(page = request.path)
pv.views = pv.views + 1
pv.save() # SLOWWWWWWWWWWWWWW
认为我应该通过使整个过程异步来提高速度,这是否自然?
答案 0 :(得分:5)
看看Celery。它为您提供异步工作人员,可以完全按照您的要求卸载任务:发送电子邮件,计算页面浏览量等。它最初只适用于Django,但现在也适用于其他环境。
答案 1 :(得分: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()
cron-job每隔N分钟扫描一次该目录并更新文本索引。
在您的情况下,我会将request.path写入文件,并在后台更新PageView模型。这样可以提高性能,因为您不需要为每个增量运算符命中数据库。
答案 2 :(得分:0)
您可以拥有一个python ThreadPool并将写入分配给数据库。尽管GIL阻止Python线程同时工作,但这允许在写入完成之前继续响应流程。
当写入的结果对于呈现响应并不重要时,我使用这种技术。
当然,如果你想发布请求并希望返回201,这不是一种上帝的做法。
答案 3 :(得分:-1)
http://www.mongodb.org/可以做到这一点。