让Django变得环保

10 投票
2 回答
2990 浏览
提问于 2025-04-17 13:02

我有一个Django的管理命令,它会发送成千上万的TCP/UDP请求。为了加快速度,我使用了Gevent,并把我的代码重构成协程的形式。这样一来,socket连接就不会再阻塞了。不过根据我了解到的,Django的某些部分还是不支持绿色线程。(这里的“绿色”是指使用绿色线程的意思。)

你能告诉我Django哪些部分不支持绿色线程吗?我该怎么做才能让它们支持呢?我觉得有些和数据库相关的部分还是会阻塞。有没有什么库或者补丁可以帮助我让Django变得“绿色”?

我对请求/响应的循环是否“绿色”并不是太在意,所以使用Gunicorn会有帮助吗?

谢谢

2 个回答

2

gevent 这个库不会对那些使用 C 扩展的第三方库进行“绿色化”,也就是说,如果一个库是用 C 写的,gevent 就无法对它进行改造。只有当使用的是标准库时,gevent 才能对它们进行“猴子补丁”,也就是修改它们的行为。

有些数据库驱动程序当然是依赖于数据库本身的实现。即使你使用了一个经过“绿色化”的库,也不意味着你的数据库会以“绿色”的方式工作。这种特性还需要在数据库层面上进行设置。例如,PostgreSQL 从 2.2 版本开始就支持异步命令处理。

另外,你可能想看看 使用 gevent 的项目

Gunicorn 会让你的生活更轻松,特别是在你开始部署应用程序的时候。在开发过程中,我也推荐使用 gunicorn(配合 gevent),而不是普通的 django runserver 命令,因为它能更快地处理同时到来的请求。

10

gevent的猴子补丁会对标准库进行修改,使其更适合Greenlet使用。这将解决很多常见的Django调用问题。

from gevent import monkey; monkey.patch_all()

关于数据库,通常接口是阻塞的。如果你使用的是PostgreSQL,可以查看psyco_gevent,这个工具可以对psycopg2进行修改,使其能够与gevent协同工作。

撰写回答