使用Gevent和阻塞代码

时间:2014-04-14 17:29:32

标签: python asynchronous flask gevent

我正在构建一个有推送事件的网站,因此需要Gevent websockets才能工作,但其余的代码都是阻塞的,因为我真的不知道如何让它成为异步。

因此,使用Gevent和阻塞代码是否有问题? 我正在使用 monkey patch_all 并像这样启动服务器,再加上一个nginx代理传递来隐藏端口号:

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

如果我理解为好,那么所有这些都将确保阻止代码流通过Greenlets合作?

就像我有这个简单的代码(主页的路线定义)从帖子集合中提取所有项目一样,将其保存在数据库 var并提供给 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 :(得分:0)

如果monkey patch_all是项目导入的第一个模块之一,则代码将运行合作。 Monkey补丁替换了python模块中的许多阻塞构建,其中非阻塞gevent版本的行为方式相同但非阻塞。

因此,如果您的数据库/网络服务器正在使用普通的tcp连接,或者您正在使用“绿色”网络服务器。您不必做任何事情的数据库驱动程序的版本,事情将完全合作。

gevent tutorial