thi*_*red 6 database django concurrency django-models eventlet
总体情况是:我想在一些外部使用Django模型时执行异步IO的应用程序中使用eventlet.在外部使用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绑定应用程序.
有一些项目可以让Django与greenlet配合良好.我会查看 psycogreen,它使用Psycopg> = 2.2中的协同程序支持.有一篇关于使用gevent,gunicorn和psycogreen以及Django的博客文章:http://dbinit.com/blog/going-green/ .