2015-02-04 18 views
7

Sto usando Python requests nel sedano workers per effettuare un numero elevato di chiamate API (~ 10/sec) (include GET, POST, PUT, DELETE). Ogni richiesta richiede circa 5-10 secondi per essere completata.Celery + Eventlet + richieste non bloccanti

Ho provato a gestire i lavoratori del sedano nel pool eventlet, con 1000 simultaneità.

Poiché requests sono processi di blocco, ogni connessione simultanea è in attesa su una richiesta.

Come si effettua requests in modo asincrono?

risposta

10

Utilizzare la patch di scimmia di eventlet [1] per rendere qualsiasi libreria Python pura non bloccante.

  • patch singola libreria # import requests # instead do this: import eventlet requests = eventlet.import_patched('requests') pacchetti erequest e grequest potrebbero essere ridotti a queste due righe.
  • cerotto tutto import eventlet eventlet.monkey_patch() # must execute as early as possible ... import requests, amqp, memcache, paramiko, redis # everything is non-blocking now

[1] http://eventlet.net/doc/patching.html

Update: c'è noto problema [2] con la scimmia patch richieste biblioteca. Se ottieni ImportError: cannot import name utils , modifica la riga di importazione in requests = eventlet.import_patched('requests.__init__') [2] https://github.com/eventlet/eventlet/issues/7

+1

Perfetto! " ' request = eventlet.import_patched ('richieste') ' che stava dando impossibile importare utils (' from. Import utils') Quindi l'ho cambiato in 'requests = eventlet.import_patched ('richieste .__ init __') 'come da https://github.com/eventlet/eventlet/issues/7 grazie ancora – Maddy

+0

@Maddy, a parte l'applicazione delle patch alla libreria di richieste, c'era qualcos'altro richiesto per fare richieste asincrone e c'era anche qualche cambiamento nel modo in cui la risposta veniva raccolta dopo la richiesta? Post patching possiamo ancora fare resp = requests.get ("http://google.com")? – amrx

+0

@amrx Al momento ha funzionato, ma sono sicuro che ora devono aggiornare le patch. – Maddy

2

dal docs:

ci sono un sacco di progetti là fuori che combinano le richieste con uno dei quadri Asincronicità di Python. Due ottimi esempi sono grequests e requests-futures.

per eventlet specifico è possibile utilizzare erequests.

+0

Il comando 'grequests' funziona con l'eventlet? – Maddy

+1

c'è anche questo - https://github.com/saghul/erequests – WeaselFox

+0

Si prega di modificare la risposta per includere questo link in modo che io possa accettarlo – Maddy

Problemi correlati