2017-07-15 1 views
0

J'ai demandé Make a non-blocking request with requests when running Flask with Gunicorn and Gevent avant, et maintenant j'ai une question plus avancée sur des sujets connexes.Faire une demande web asynchrone avec des demandes lors de l'exécution Flask avec Gunicorn et Gevent

Mon application Flask recevra une demande, effectuera un traitement, puis effectuera deux demandes différentes auprès de deux points de terminaison externes lents différents, chacun prenant 2 secondes pour répondre. Mon code flacon se présente comme suit:

import requests 

@app.route('/do', methods = ['POST']) 
def do(): 
    resulta = requests.get('slow api a') // takes 2 seconds to response 
    resultb = requests.get('slow api b') // takes 2 seconds to response 
    return resulta.content + resultb.content 

Et je lance mon gunicorn avec

gunicorn server:app -k gevent -w 4 

Avec ce code, pour chaque demande qui envoient à ce service web, je dois attendre 4 secondes pour répondre (Il envoie à 'lent api a' d'abord, puis fait 'lent api b'). Comment puis-je modifier l'exemple pour que la demande envoyée à 'slow api a' et 'slow api b' puisse être envoyée en même temps, afin que je puisse obtenir une réponse de ce service web en 2 secondes au lieu de 4 secondes?

+0

version python? 3.5? 3.6? – Grimmy

+0

Utiliser [grequests] (https://github.com/kennethreitz/grequests) au lieu des requêtes –

+0

La version de python est 2.7, se penchera sur les requêtes grequests. – JLTChiu

Répondre

0

Vous devez utiliser le traitement multiple ou le filetage.

import multiprocessing 
import time 

def testa(): 
    time.sleep(3) 
    return 'a' 

def testb(): 
    time.sleep(3) 
    return 'b' 

if __name__ == '__main__': 
    jobs = [] 
    for j in [testa, testb]: 
     p = multiprocessing.Process(target=j) 
     jobs.append(p) 
     p.start() 
    for k in jobs: 
     k.join() 

[root @ node01 opt] # temps python r.py

0m3.028s réel utilisateur 0m0.021s sys [root @ node01 opt]