Qualche tempo fa ho scritto un web spider che ho multithread per consentire che si verifichino contemporaneamente richieste. Questo è accaduto nella mia giovinezza in Python, nei giorni prima che venissi a conoscenza del GIL e dei problemi associati che crea per il codice multithread (IE, il più delle volte le cose finiscono per serializzare!) ...
Vorrei rielaborare questo codice per renderlo più robusto e ottenere prestazioni migliori. Ci sono fondamentalmente due modi per farlo: potrei usare il nuovo modulo multiprocessore in 2.6+ o potrei scegliere un modello basato su reattore / evento di qualche tipo. Preferirei fare più tardi poiché è molto più semplice e meno soggetto a errori.
Quindi la domanda riguarda quale quadro sarebbe più adatto alle mie esigenze. Di seguito è riportato un elenco delle opzioni che conosco finora:
- Twisted : Il nonno dei framework dei reattori Python: sembra complesso e un po 'gonfio. Ripida curva di apprendimento per un piccolo compito.
- Eventlet : dai ragazzi di Lindenlab . Framework basato su Greenlet che è orientato verso questo tipo di attività. Ho dato un'occhiata al codice e non è troppo carino: non conforme a pep8, sparso con stampe (perché le persone lo fanno in un framework !?), API sembra un po 'incoerente.
- PyEv : Immaturo, non sembra essere nessuno che lo sta usando in questo momento anche se è basato su libevent, quindi ha un solido backend.
- asyncore : Da stdlib: über di basso livello, sembra un sacco di legwork coinvolti solo per ottenere qualcosa da terra.
- tornado : sebbene si tratti di un prodotto orientato al server progettato per server di siti Web dinamici, presenta un client HTTP asincrono e un semplice ioloop . Sembra che potrebbe portare a termine il lavoro, ma non per quello a cui era destinato. [modifica: purtroppo non funziona su Windows, il che lo conta per me - è un requisito per me supportare questa piattaforma zoppa]
C'è qualcosa che mi è mancato per niente? Sicuramente ci deve essere una libreria là fuori che si adatta al punto debole di una libreria di rete asincrona semplificata!
[modifica: grande grazie a intgr per il suo puntatore a questa pagina . Se scorri verso il basso vedrai che c'è un elenco davvero bello di progetti che mirano ad affrontare questo compito in un modo o nell'altro. In realtà sembra che le cose siano effettivamente andate avanti sin dall'inizio di Twisted: le persone sembrano preferire una soluzione basata sulla routine comune piuttosto che una tradizionale orientata al reattore / callback. I vantaggi di questo approccio sono codici più chiari e diretti: sicuramente li ho trovati in passato, specialmente quando si lavora con boost.asioin C ++ quel codice basato sulla callback può portare a progetti che possono essere difficili da seguire e sono relativamente oscuri alla vista non allenata. L'uso di co-routine consente di scrivere un codice che sembri almeno un po 'più sincrono. Immagino che ora il mio compito sia capire quale di queste tante librerie mi piaccia guardare e provarci! Sono contento di averlo chiesto ora ...]
[modifica: forse di interesse per chiunque abbia seguito o inciampato su questa domanda o si preoccupi di questo argomento in qualsiasi senso: ho trovato un ottimo resoconto dello stato attuale degli strumenti disponibili per questo lavoro]
select
per il multiplexing I / O. Ma dovresti essere in grado di ottenere prestazioni decenti con il tornado-pyuv . 2. Ora c'è asyncio in Python 3.3+ e il suo backport trollius che consente di eseguire qualsiasi applicazione Tornado nel suo loop di eventi (Twisted sarà presto supportato).