7
votes

Lire un site web avec asyncore

J'aimerais lire un site Web asynchrone, ce qui n'est pas possible avec Urllib autant que je sache. Maintenant, j'ai essayé de lire avec des sockets simples, mais http me donne l'enfer. Je rencontre toutes sortes de codages funky, par exemple le codage de transfert: chunked, doit analyser tout ce genre de choses manuellement, et je me sens comme le codage C, pas python pour le moment.

Il n'y a pas une manière plus agréable comme Urllib, de manière asynchrone? Je n'ai pas vraiment envie de ré-mettre en œuvre toute la spécification HTTP, quand tout est fait avant.

Twisted n'est pas une option actuellement.

salutations,

Tom


0 commentaires

4 Réponses :


7
votes

Vous pouvez mettre en œuvre un appel asynchrone vous-même. Pour chaque appel, démarrez un nouveau fil (ou essayez d'en obtenir un à partir d'un pool) et d'utiliser un rappel pour le traiter.

Vous pouvez le faire très bien avec un décorateur: P>

def threaded(callback=lambda *args, **kwargs: None, daemonic=False):
    """Decorate  a function to run in its own thread and report the result
    by calling callback with it."""
    def innerDecorator(func):
        def inner(*args, **kwargs):
            target = lambda: callback(func(*args, **kwargs))
            t = threading.Thread(target=target)
            t.setDaemon(daemonic)
            t.start()
        return inner
    return innerDecorator

@threaded()
def get_webpage(url):
    data = urllib.urlopen(url).read()
    print data


1 commentaires

Suis-je la seule personne qui pense que cette solution est brillante ? La chose qui fait mieux que toutes les autres méthodes HTTP Async HTTP est que c'est en fait une solution asynchrone entièrement générale à n'importe quoi . Vous pouvez remplacer get_webpage avec n'importe quel code souhaité et le faire de manière asynchrone.



5
votes

Avez-vous regardé http://asynchttp.sourceforge.net/ ?

"Client HTTP asynchrone pour Python

Le module 'ASYNCHTTP' '' '' est une extension logique de la bibliothèque Python 'Asynchat' Module intégré sur les modules "Asyncore" et "Sélectionner". Notre objectif est de fournir la fonctionnalité de l'excellent module «HTTPLIB» sans utiliser de sockets de blocage. "

Le dernier commit du projet était de 2001-05-29, il semble donc mort. Mais cela pourrait être d'intérêt quand même.

Disclaimer: Je ne l'ai pas utilisé moi-même.

Aussi, Cet article de blog a des informations sur ASYNC HTTP.


0 commentaires

1
votes

Le plus éloigné que je suis venu était en utilisant ASYNCHTTP modifié, que Codeape a suggéré. J'ai essayé d'utiliser ASYNCORE / ASYNCHAT et ASYNCHTTP, avec beaucoup de douleur. Il m'a fallu beaucoup trop longtemps pour essayer de résoudre tous les insectes dedans (il y a une méthode manuelle_read, presque copiée d'Asyncore, seulement mal en retrait et me donnait des maux de tête avec un codage à fourche). De plus, ASYNCORE et ASYNCHAT sont mieux utilisés selon certaines astuces que j'ai eues sur Google.

Je me suis installé avec tordu, mais c'est évidemment hors de la question pour vous.

Cela pourrait également dépendre de ce que vous essayez de faire avec votre application et de la raison pour laquelle vous souhaitez des demandes asynchronisées, si des threads sont une option ou non, si vous faites une programmation d'interface graphique ou quelque chose d'autre afin que vous puissiez modifier une autre inforation, C'est toujours bon. Sinon, je voterais pour une version filetée suggérée ci-dessus, il offre beaucoup plus de lisibilité et de maintenabilité.


0 commentaires

1
votes

L'exemple de client HTTP simple ASYNCORE est assez simple :)

http: //docs.python .org / bibliothèque / asyncore.html xxx


0 commentaires