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?
ich bin nicht sicher, was diese Empfehlung bedeutet – Rob
Ich würde empfehlen Sie diese https://stackoverflow.com/help/how-to-answer – Rob
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