我可以让 Django “greenlet-safe”吗?
大局是: 我想在一些应用程序中使用 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 密集型应用程序的速度。
The big picture is:
I want to use eventlet in some application that does asynchronous IO while working with Django models externally. Working with Django externally is simple (see Django: How can I use my model classes to interact with my database from outside Django?) but it's not the main problem.
I presume (I haven't tested) that using Django from greenlets is dangerous. Actually, in the case of psycopg2, we have this warning (see http://www.initd.org/psycopg/docs/advanced.html#support-to-coroutine-libraries):
Psycopg connections are not green
thread safe and can’t be used
concurrently by different green
threads
In Django there is one db connection per thread (right?) and as such it may lead to scary scenarios when used. Is it possible to provide a connection object manually somehow? Or make it "greenlet-local"?
My motivation is to use connection pool from eventlet (http://eventlet.net/doc/modules/db_pool.html) so that I could speed up my IO-bound application.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
有一些项目可以让 Django 与 greenlet 很好地配合工作。我会查看 psycogreen 它使用 Psycopg >= 2.2 中的协程支持。有一篇关于将 gevent、gunicorn 和 psycogreen 与 Django 一起使用的优秀博客文章:http://dbinit。 com/blog/going-green/。
There are some projects out there to make Django work well with greenlet. I would check out psycogreen which uses the coroutines support in Psycopg >= 2.2. There is a good blog post on using gevent, gunicorn, and psycogreen together with Django: http://dbinit.com/blog/going-green/.