在阻塞代码中使用Gevent

0 投票
1 回答
538 浏览
提问于 2025-04-18 02:42

我正在搭建一个网站,需要用到推送事件,所以我需要使用Gevent的WebSocket。不过,其它的代码都是阻塞的,因为我其实不知道怎么把它改成异步的。

因此,使用Gevent和阻塞代码会有什么问题吗?我在使用monkey patch_all,并且像这样启动服务器,同时用nginx代理来隐藏端口号:

WSGIServer(('127.0.0.1', 8000), app).serve_forever()

如果我理解得没错,做这些操作会让阻塞的代码流变得更合作,通过Greenlets来实现?

比如我有一段简单的代码(首页的路由定义),它从posts集合中获取所有的项目,把它们保存在database变量中,然后传递给render_template(index.html),作为db,接下来会进行循环处理:

# front page
def index():
    database = posts.find()
    return render_template('index.html', db=database)

这就是index.html的内容:

{% extends 'layout.html' %}

{% block body %}


  <div class=post>

  {% for post in db %}

      <h4><a href="/post/{{ post._id }}/{{ post.slug }}"> {{ post.title }} </a></h4>

  {% endfor %}

  </div>


{% endblock %}

这段代码在使用Gevent时安全吗?还是说我应该考虑其他的方案?

如果不安全,我该怎么做才能让它变成异步的?要把循环拆分吗?像posts.find()这样的数据库调用要“异步化”吗?

1 个回答

0

如果你的项目一开始就导入了 monkey patch_all 这个模块,那么你的代码就会以协作的方式运行。简单来说,Monkey patch 会把很多 Python 内置的阻塞模块替换成非阻塞的 gevent 版本,它们的行为是一样的,但不会阻塞程序的运行。

所以,如果你的数据库或网页服务器使用的是普通的 TCP 连接,或者你使用的是数据库驱动的“绿色”版本,那么你就不需要做任何额外的操作,程序就会自动以协作的方式运行。

gevent 教程

撰写回答