在阻塞代码中使用Gevent
我正在搭建一个网站,需要用到推送事件,所以我需要使用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 连接,或者你使用的是数据库驱动的“绿色”版本,那么你就不需要做任何额外的操作,程序就会自动以协作的方式运行。