簡體   English   中英

tornado.web.RequestHandler.render_string()如何在不阻塞整個應用程序的情況下加載模板?

[英]How does tornado.web.RequestHandler.render_string() load a template without blocking the whole application?

我正在使用render_string()從Tornado中的協程加載模板,我想到render_string()不是協程。 因此我們從協同程序訪問磁盤,但我們不會產生任何未來。 我想知道它是如何工作的,如果它阻止了應用程序。

確實,第一次從磁盤讀取給定模板時,它會阻止Tornado的事件循環:

class Loader(BaseLoader):
    def _create_template(self, name):
        path = os.path.join(self.root, name)
        with open(path, "rb") as f:
            template = Template(f.read(), name=name, loader=self)
            return template

這個初始加載可能很快,因為模板可能只有幾千字節並且已經加載到機器的內存中文件系統緩存中。 通過相同的Tornado進程對同一模板的后續訪問將在Tornado中自動緩存:

class BaseLoader(object):
    def load(self, name, parent_path=None):
        """Loads a template."""
        name = self.resolve_path(name, parent_path=parent_path)
        with self.lock:
            if name not in self.templates:
                self.templates[name] = self._create_template(name)
            return self.templates[name]

因此,Tornado將文件系統訪問權限推遲到線程似乎並不值得。

通常在Python異步框架中,您將看到並非所有I / O都是異步執行的 - 快速且可預測的阻塞操作(如訪問文件或MySQL查詢)可能無法長時間阻止循環而無法擔心。 重要的是,在事件循環中調度長或不可預測的操作,如調用遠程HTTP服務。

暫無
暫無

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

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