【问题标题】:Can I make Django "greenlet-safe"?我可以让 Django “greenlet-safe”吗?
【发布时间】:2011-07-11 05:25:03
【问题描述】:

大图是: 我想在一些在外部使用 Django 模型时执行异步 IO 的应用程序中使用 eventlet。在外部使用 Django 很简单(参见 Django: How can I use my model classes to interact with my database from outside 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 绑定应用程序。

【问题讨论】:

    标签: database django django-models concurrency eventlet


    【解决方案1】:

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

    【讨论】:

    • 这很有帮助,但不能准确回答我的问题。经过一些阅读和挖掘,我非常确信我可以毫无问题地从 eventlet 使用 Django。唯一要做的就是运行“eventlet.monkey_patch()”,这将改变threading.local(和其他系统库),因此连接将变为“greenlet-local”而不是“thread-local”。此外,eventlet 对 psycopg2 进行了修补,因此一切都应该顺利运行。
    • 也许我误读了这个问题。如果您使用 eventlet 的目标是连接池,为什么不使用 pgpool 或 pgbouncer?
    • 我使用 eventlet 来做一些网络抓取工作,我正在使用 Django 模型将这些数据放入数据库。因此,我很好奇连接是否是“greenlet-safe”,这样并发的greenthreads就不会相互碰撞。他们在猴子修补之后。此外,在那之后,数据库操作也是并发的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 2013-03-29
    • 2014-10-01
    • 1970-01-01
    • 2018-03-30
    相关资源
    最近更新 更多