是否有人在进行异步数据库提交?

时间:2011-12-13 00:26:17

标签: python django asynchronous

我遇到的大多数最长(最耗时)的逻辑基本上涉及两件事:发送电子邮件和将项目提交到数据库。

是否有任何内置机制可以异步执行这些操作,以免减慢页面加载速度?

验证应该同步处理,但实际上,通过电子邮件发送和写入数据库的最佳方式应该是异步的。

例如,假设我要跟踪综合浏览量。因此,每次我得到一个观点,我都会这样做:

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

认为我应该通过使整个过程异步来提高速度,这是否自然?

4 个答案:

答案 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/可以做到这一点。