2017-07-27 3 views
0

J'ai fait une application de flacon de base en utilisant gunicorn avec la classe des travailleurs gevent. Le problème que j'ai rencontré était le suivant. Si j'avais une application de flacon de base comme celui-ci:Utilisation de multitraitement avec gunicorn dans l'application 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) 

Et je pris deux techniques à elle, technique 1 brisera gunicorn si je le lance comme:

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

mais technique 2 won » t. Je vois cela est parce que la technique 1 repose sur multitraitement et technique 2 repose sur des fils, mais je ne peux pas comprendre pourquoi une catégorie des travailleurs de gevent ne permet pas une piscine?

Répondre

-1

Si vous utilisez gevent. Vous devriez essayer d'utiliser monkey_patch.

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

+0

Je ne suis pas sûr de ce que signifie cette recommandation – Rob

+0

je vous recommande de consulter cette https://stackoverflow.com/help/how-to-answer – Rob

+0

Si vous êtes en utilisant gevent vous devriez avoir lu la docs d'abord avant de l'utiliser. C'est la partie la plus critique que vous devriez mettre dans votre code avant d'exécuter un code gevent/eventlet. Le patch de singe transformera les appels de bas niveau en non-bloquants. Technique 2 fonctionne sur les threads natifs de python. Sans monkey patch, il va bloquer. Le patch de singe transformera les appels de bas niveau de ces appels de threads en non bloquants. (RTMS) – ionheart