在使用Gunicorn和Gevent运行Flask时,请求异步Web请求

时间:2017-07-15 05:28:17

标签: python asynchronous flask gunicorn gevent

之前我问过Make a non-blocking request with requests when running Flask with Gunicorn and Gevent,现在我对相关主题提出了一个更高级的问题。

My Flask应用程序将收到请求,进行一些处理,然后向两个不同的慢速外部端点发出两个不同的请求,每个端点需要2秒钟才能响应。我的烧瓶代码如下:

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

我用

运行我的枪炮
gunicorn server:app -k gevent -w 4

使用此代码,对于发送到此Web服务的每个请求,我需要等待4秒才能响应(它首先发送到'slow api a',然后执行'slow api b')。如何修改示例,以便发送到'slow api a'和'slow api b'的请求可以同时发送,这样我可以在2秒而不是4秒内从此Web服务获得响应?

1 个答案:

答案 0 :(得分:0)

您应该使用多重处理或线程。

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] #time python r.py

真正的0m3.028s 用户0m0.021s sys 0m0.005s [root @ node01 opt]