2017-07-27 75 views
0

我使用Gunicorn和worker class gevent制作了一个基本的应用程序。我碰到的问题如下。如果我有一个基本的烧瓶应用程序是这样的:在Flask应用程序中使用gunicorn进行多处理

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将打破gunicorn如果我运行它想:

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

但技术2韩元”吨。我看到这是因为技术1依赖于多处理技术2技术依赖于线程,但我不知道为什么gevent工人类不允许池?

回答

-1

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

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

+0

我不知道这是什么推荐手段 – Rob

+0

我建议你如果你使用的GEVENT你应该已经阅读阅读本https://stackoverflow.com/help/how-to-answer – Rob

+0

的docs首先在使用它之前。在运行任何gevent/eventlet代码之前,它是最关键的部分,您应该将它放入代码中。 Monkey补丁会将低级调用转变为非阻塞。 技术2在python本机线程上运行。没有猴子修补它,它会被阻止。 Monkey修补会将该线程调用的低级调用转变为非阻塞。 (RTMS) – ionheart

相关问题