Maison base de données tutoriel mysql Tornado 的 stack context

Tornado 的 stack context

Jun 07, 2016 pm 04:29 PM
context stack tornado

按:本人 python 菜鸟,对 tornado 更没什么研究,这两天小摆弄了一下,记一下,有不对的还请指正 这两天在用 tornado 做一个 memcached 的 proxy,作为一个 Python 的高性能异步框架,tornado (实际是 epoll/kqueue )的思想是——单线程+异步化,线程的运

按:本人 python 菜鸟,对 tornado 更没什么研究,这两天小摆弄了一下,记一下,有不对的还请指正

这两天在用 tornado 做一个 memcached 的 proxy,作为一个 Python 的高性能异步框架,tornado (实际是 epoll/kqueue… )的思想是——单线程+异步化,线程的运行时间不等待任何东西,这样就要求 memcached 的访问也必须异步化。如果线程在等待中消耗了,就无法达到高并发的目的,这个问题是无法通过简单地交给线程池或什么其他东西来达到的。

于是,这里就不能用常用的 python-memcache 来做了,实际上有几个基于 tornado 的 memcache 客户端,这个是维护得相对好的一个,也是一年前的了,而且,有两个问题:

  • 连接建立是同步的,不是异步的
  • 没有超时机制

这样,在 server 或网络出现问题的时候,就可能遇到*烦,所以,我的目的就是绞尽脑汁加入超时机制,这个初步做出来了,等把 get 之外的方法也都异步化之后就反馈出来。这里主要依赖的机制就是 tornado 的 stack context——再次声明,我是这个方面的菜鸟,有什么不对的地方大家嘘之余给指出来呗。

Stack context 的意图就是为执行程序保存一个上下文,在需要的时候,可以回到这个上下文执行,包括异常,都可以更好地、统一地处理。这个功能的代码不是很多,也比较清晰,但是文档……嗯,至少我是没看明白,结合 httpclient 的源码作为例子,加上看 stack_context 的代码,大概明白了是怎么用了。

首先,在希望抓住问题的入口的地方要留住上下文:

        #......
        context = partial(self._cleanup, fail_callback = fail_callback)
        with stack_context.StackContext(context):
            getattr(c, cmd)(*args, **kwargs)
Copier après la connexion

这里,后面的执行内容,包括回调、触发事件,都可以通过抛出异常退到这里,而管理异常的就是 context,这里,用 functools.partial 包装了一下 _cleanup,_cleanup 的写法大致是这样的:

    @contextlib.contextmanager
    def _cleanup(self, fail_callback = None):
        try:
            yield
        except _Error as e:
            print "gotcha", e
            if fail_callback:
                fail_callback(e.args)
Copier après la connexion

这里,异常会被捕获,并调用用户指定的出错回调函数进行处理。后面的代码里,遇到故障,抛出异常就可以了,比如,可以用这个异常来返回超时:

    def _on_timeout(self, server):
        self._timeout = None
        server.mark_dead('Time out')
        raise _Error('memcache call timeout')
Copier après la connexion

这个异常是通过 io_loop 的 timeout 方法来触发的:

            self._timeout = self.io_loop.add_timeout(
                    time.time() + self.request_timeout,
                    stack_context.wrap(partial(self._on_timeout, server)))
Copier après la connexion

这样,就可以在异步程序里比较干净地处理掉超时问题了。

这个代码对我这个水平的初学者还是比较晦涩的,大家可以参考下 HTTPClient 的源码,等我把这个 memcached client 的代码改完之后,也会放出来供参考指正的。

—-

update2: 放这里了?https://github.com/gnawux/tornado-memcache?, get 测试过,其他还没有,另外,我不是多个 server sharding 的应用场景,相关的还没测试。

update :对于 timeout,设上了表忘了清除,如果是其他方式抛异常退出的话,也在抛异常的地方或者是最后处理异常的时候,把超时去掉

        if self._timeout is not None:
            self.io_loop.remove_timeout(self._timeout)
            self._timeout = None
Copier après la connexion
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Que signifie le contexte ? Que signifie le contexte ? Aug 04, 2023 pm 05:27 PM

Le contexte est l'environnement et les informations d'état lorsque le programme est exécuté. Il peut inclure diverses informations, telles que la valeur des variables, la pile d'appels de fonctions, l'emplacement d'exécution du programme, etc., permettant au programme d'effectuer les correspondances. décisions basées sur différents contextes et effectuer les opérations correspondantes.

Comment utiliser le contexte pour implémenter la mise en cache des requêtes dans Go Comment utiliser le contexte pour implémenter la mise en cache des requêtes dans Go Jul 22, 2023 pm 10:51 PM

Comment utiliser le contexte pour implémenter la mise en cache des requêtes dans Go Introduction : Lors de la création d'applications Web, nous avons souvent besoin de mettre en cache les requêtes pour améliorer les performances. Dans le langage Go, nous pouvons utiliser le package de contexte pour implémenter la fonction de mise en cache des requêtes. Cet article expliquera comment utiliser le package de contexte pour implémenter la mise en cache des requêtes et fournira des exemples de code pour aider les lecteurs à mieux comprendre. Qu’est-ce que le contexte ? : En langage Go, le package de contexte fournit un moyen de passer entre plusieurs goroutines

Une exploration approfondie des aspects structurels et des fonctions d'OP Stack Une exploration approfondie des aspects structurels et des fonctions d'OP Stack Jan 18, 2024 pm 05:45 PM

OPStack est un framework blockchain open source publié par Optimism Collective, le groupe de développement derrière Optimism Network. Il s’agit d’un outil important pour les communautés Ethereum et Optimism. L'objectif principal d'OPStack est de renforcer le réseau Optimism, en fournissant des outils logiciels clés au réseau principal Optimism, ainsi qu'à la prochaine superchaîne Optimism et à son modèle de gouvernance. En fournissant un environnement orienté développeur, l'idée principale d'OPStack est de promouvoir la croissance et l'innovation dans l'espace Ethereum. Il ouvre la voie à des développements de pointe et simplifie la création de blockchain. OPStac

Comment utiliser le contexte pour implémenter le suivi des liens de demande dans Go Comment utiliser le contexte pour implémenter le suivi des liens de demande dans Go Jul 21, 2023 pm 05:57 PM

Comment utiliser le contexte pour implémenter le suivi des liens de demande dans Go Dans l'architecture des microservices, le suivi des liens de demande est une technologie très importante utilisée pour suivre la livraison et le traitement d'une demande entre plusieurs microservices. Dans le langage Go, nous pouvons utiliser le package de contexte pour implémenter le suivi des liens de demande. Cet article explique comment utiliser le contexte pour le suivi des liens de demande et donne des exemples de code. Tout d’abord, nous devons comprendre les concepts de base et l’utilisation du package contextuel. Le package de contexte fournit un mécanisme

Solution à NotImplementedError() Solution à NotImplementedError() Mar 01, 2024 pm 03:10 PM

La raison de l'erreur est en python. La raison pour laquelle NotImplementedError() est lancée dans Tornado peut être due au fait qu'une méthode ou une interface abstraite n'est pas implémentée. Ces méthodes ou interfaces sont déclarées dans la classe parent mais non implémentées dans la classe enfant. Les sous-classes doivent implémenter ces méthodes ou interfaces pour fonctionner correctement. Comment résoudre ce problème consiste à implémenter la méthode abstraite ou l'interface déclarée par la classe parent dans la classe enfant. Si vous utilisez une classe pour hériter d'une autre classe et que vous voyez cette erreur, vous devez implémenter toutes les méthodes abstraites déclarées dans la classe parent dans la classe enfant. Si vous utilisez une interface et que vous voyez cette erreur, vous devez implémenter toutes les méthodes déclarées dans l'interface dans la classe qui implémente l'interface. Si vous n'êtes pas sûr de savoir lequel

Comment utiliser le contexte pour transmettre les paramètres de requête dans Go Comment utiliser le contexte pour transmettre les paramètres de requête dans Go Jul 22, 2023 pm 04:43 PM

Le package de contexte dans le langage Go est utilisé pour transmettre des informations contextuelles de requête dans le programme. Il peut transmettre des paramètres, intercepter des requêtes et annuler des opérations entre des fonctions sur plusieurs Goroutines. Pour utiliser le package de contexte dans Go, nous devons d'abord importer le package "context". Vous trouverez ci-dessous un exemple qui montre comment utiliser le package de contexte pour implémenter le passage des paramètres de requête. packagemainimport("contexte"

Comment utiliser le contexte pour implémenter le contrôle du délai d'expiration des requêtes dans Go Comment utiliser le contexte pour implémenter le contrôle du délai d'expiration des requêtes dans Go Jul 21, 2023 pm 12:18 PM

Comment utiliser le contexte pour implémenter le contrôle du délai d'expiration des requêtes dans Go Introduction : Lorsque nous effectuons des requêtes réseau, nous rencontrons souvent des problèmes de délai d'expiration des requêtes. Une requête réseau qui ne répond pas pendant une longue période gaspillera non seulement les ressources du serveur, mais affectera également les performances globales. Afin de résoudre ce problème, le langage Go a introduit le package contextuel, qui peut être utilisé pour implémenter le contrôle du délai d'attente des requêtes. Cet article expliquera comment utiliser le package de contexte pour implémenter le contrôle du délai d'expiration des requêtes dans Go et joindra des exemples de code correspondants. 1. Comprendre le contexte du package co

Java utilise la fonction empty() de la classe Stack pour déterminer si la pile est vide. Java utilise la fonction empty() de la classe Stack pour déterminer si la pile est vide. Jul 25, 2023 pm 10:25 PM

Java utilise la fonction empty() de la classe Stack pour déterminer si la pile est vide. La pile (Stack) est une structure de données courante qui suit le principe du premier entré, dernier sorti (FILO). En Java, nous pouvons utiliser la classe Stack pour implémenter les fonctionnalités de la pile. La classe Stack fournit une série de méthodes pour faire fonctionner la pile. L'une des méthodes couramment utilisées est la fonction empty(), qui permet de déterminer si la pile est vide. En Java, la classe Stack se trouve dans le package java.util. Pour utiliser cette classe, vous avez besoin.

See all articles