簡體   English   中英

在Tornado放置定制gen.Tasks的位置?

[英]Where to put custom gen.Tasks in Tornado?

我正在嘗試在Tornado中運行while循環,同時保持WebSocketHandler打開。 我試圖實現gen.Task:

class WSHandler(tornado.websocket.WebSocketHandler):
    count = db.my_collection.count() - 1
    cursor = coll.find(tailable=True, await_data=True, skip=count)

    (...)

    @asynchronous
    @gen.engine
    def run(self):
        doc = yield gen.Task(curse)
        self.render(doc)

    def curse(self):
        while WSHandler.cursor.alive:
        try:
            doc = WSHandler.cursor.next()
            return doc

    def render(doc)
        for c in WSHandler.connections:
            c['id'].write_message(doc) 

因此,除了保持WebSocket打開之外, WSHandler還具有這些其他自定義功能。 我需要運行一個常量循環( curse(self) )來尾隨mongodb的光標 - 並且異步,因此它不會阻止WebSocketHandler

我的設置錯了嗎? 我應該把這些功能放在其他地方嗎? (在哪里?)如何運行無限while loopwhile loop保持打開WebSocketHandler

看起來你正在使用PyMongo, 它阻止了 while循環也會阻塞; 把它放在gen.Task中沒有任何幫助。 gen.Task只是回調的糖; 這基本上是另一種寫作方式:

def run(self):
    doc = self.curse(callback=self.render)
    self.render(doc)

def curse(self, callback=None):
    while self.cursor.alive:
        doc = self.cursor.next()
        callback(doc)

龍卷風已經是一個無限循環; 你不能在Tornado應用程序中真正擁有另一個,也不應該。 您可以做的是使用異步數據庫客戶端(例如asyncmongo),它應該允許您簡單地:

cursor = coll.find(tailable=True, callback=render, ...)

並在收到文檔時觸發您的回調方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM