繁体   English   中英

在Flask应用程序中对Gunicorn使用多处理

[英]Using multiprocessing with gunicorn in Flask application

我使用Gunicorn和worker类的gevent开发了一个基本的flask应用程序。 我遇到的问题如下。 如果我有一个像这样的基本烧瓶应用程序:

from multiprocessing import Pool
import Queue
import random
from threading import Thread
import time

from flask import Flask

app = Flask(__name__)

def f(x):
    return random.randint(1, 6)

def thread_random(queue):
    time.sleep(random.random())
    queue.put(random.randint(1, 6))

def thread_roll():
    q = Queue.Queue()
    threads = []
    for _ in range(3):
        t = Thread(target=thread_random, args=(q, ))
        t.start()
        threads.append(t)
    for t in threads:
        t.join()

    dice_roll = sum([q.get() for _ in range(3)])
    return dice_roll

@app.route('/')
def hello_world():
    # technique 1
    pool = Pool(processes=4)
    return 'roll is: %s \n' % sum(pool.map(f, range(3)))

    # technique 2
    return 'roll is: %s \n' % thread_roll()

if __name__ == '__main__':
    app.run(debug=True)

我采用了两种技术,如果我这样运行,则技术1会破坏金枪鱼:

sudo gunicorn -b 0.0.0.0:8000 app:app --worker-class gevent

但是技术2不会。 我看到这是因为技术1依赖于多处理而技术2依赖于线程,但是我无法弄清楚为什么gevent worker类不允许使用池?

如果您使用的是gevent。 您应该尝试使用monkey_patch。

http://www.gevent.org/gevent.monkey.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM