2014-04-14 61 views
0

我正在構建一個具有推送事件的網站,因此需要Gevent websockets才能工作,但其餘代碼被阻塞,因爲我真的不知道如何使其異步。在封鎖代碼中使用Gevent

因此,在使用Gevent和阻塞代碼時是否存在一些問題? 我使用猴子patch_all和象這樣啓動服務器,再加上nginx的代理通隱藏的端口號:

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

如果我沒理解好,做這一切將確保阻止代碼流將通過Greenlets進行合作?

像我這個簡單的代碼(主頁的路由定義),其獲取來自帖子集合中的所有項目,將其保存在數據庫VAR和飼料到render_template(的index.html)爲分貝是那麼將在後面循環:

# 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

看起來好像你在正確的軌道上。 – kkurian

回答

0

如果monkey patch_all是您的項目導入的第一個模塊之一,您的代碼將運行合作。 Monkey補丁用非阻塞gevent版本替換python模塊中的許多阻塞構建,這些版本的行爲方式相同,但是非阻塞。

因此,如果您的數據庫/網絡服務器使用正常的tcp連接,或者如果您使用的是數據庫驅動程序的「綠色」版本,則無需執行任何操作,而且這些操作只能起到很好的作用。

gevent tutorial