6

大局是:我想在一些应用程序中使用 eventlet,该应用程序在外部使用 Django 模型时执行异步 IO。在外部使用 Django 很简单(请参阅Django:如何使用我的模型类从 Django 外部与我的数据库进行交互?),但这不是主要问题。

我认为(我没有测试过)从 greenlets 中使用 Django 是危险的。实际上,对于 psycopg2,我们有这个警告(参见http://www.initd.org/psycopg/docs/advanced.html#support-to-coroutine-libraries):

Psycopg 连接不是绿色线程安全的,不能被不同的绿色线程同时使用

在 Django 中,每个线程有一个数据库连接(对吗?),因此在使用时可能会导致可怕的场景。是否可以以某种方式手动提供连接对象?或者让它成为“greenlet-local”?

我的动机是使用来自 eventlet ( http://eventlet.net/doc/modules/db_pool.html ) 的连接池,这样我就可以加速我的 IO 绑定应用程序。

4

1 回答 1

8

有一些项目可以让 Django 与 greenlet 一起工作。我会检查 在Psycopg >= 2.2 中使用协程支持的 psycogreen。有一篇关于将 gevent、gunicorn 和 psycogreen 与 Django 一起使用的好博文:http: //dbinit.com/blog/going-green/

于 2011-03-08T16:01:01.037 回答