我正在构建一个有推送事件的网站,因此需要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()?
答案 0 :(得分:0)
如果monkey patch_all
是项目导入的第一个模块之一,则代码将运行合作。 Monkey补丁替换了python模块中的许多阻塞构建,其中非阻塞gevent版本的行为方式相同但非阻塞。
因此,如果您的数据库/网络服务器正在使用普通的tcp连接,或者您正在使用“绿色”网络服务器。您不必做任何事情的数据库驱动程序的版本,事情将完全合作。