2017-07-27 2 views
0

Ich machte eine grundlegende Kolbenanwendung mit Gunicorn mit Arbeiterklasse gevent. Das Problem, auf das ich stieß, war wie folgt. Wenn ich einen Grundkolben App wie diese hatte:Verwendung von Multiprocessing mit Gunicorn in Flask-Anwendung

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) 

Und ich nahm zwei Techniken es, Technik 1 bricht gunicorn wenn ich es laufen mag:

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

aber Technik 2 gewonnen‘ t. Ich sehe das, weil Technik 1 auf Multiprocessing basiert und Technik 2 auf Threads basiert, aber ich kann nicht herausfinden, warum eine gevent Worker-Klasse keinen Pool zulässt?

Antwort

-1

Wenn Sie Gevent verwenden. Sie sollten versuchen, monkey_patch zu verwenden.

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

+0

ich bin nicht sicher, was diese Empfehlung bedeutet – Rob

+0

Ich würde empfehlen Sie diese https://stackoverflow.com/help/how-to-answer – Rob

+0

Wenn youre GEVENT verwenden Sie gelesen haben, sollte die Dokumentation zuerst, bevor Sie es verwenden. Es ist der Teil, der die kritischste Zeile ist, die Sie in Ihren Code einfügen sollten, bevor Sie einen gevent/eventlet-Code ausführen. Der Affe-Patch schaltet Anrufe auf niedriger Ebene auf nicht blockierend. Technique 2 wird auf nativen Python-Threads ausgeführt. Ohne Affe wird es blockiert. Das Patchen von Monkey wird Aufrufe niedriger Ebene dieses Thread-Aufrufs zu nicht-blockierend machen. (RTMS) – ionheart

Verwandte Themen