2017-07-27 4 views
0

私は、作業者クラスgeventのGunicornを使用して基本的なフラスコアプリケーションを作成しました。私が遭遇した問題は以下の通りです。私はこのような基本的なフラスコアプリがあった場合:Flaskアプリケーションでガンコーンを使用したマルチプロセッシングを使用する

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

が、技術2ウォンを」:

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) 

をそして、私はそれで2つの手法を取った私はそれが好きで実行した場合、技術1はgunicorn解除されますt。テクニック1はマルチプロセッシングに依存し、テクニック2はスレッドに依存しているからですが、なぜgeventワーカークラスがプールを許さないのか分かりません。

答えて

-1

geventを使用している場合は、あなたはmonkey_patchを使ってみるべきです。

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

+0

私はこの勧告は – Rob

+0

私はyoureのはあなたが読んでいるはずgeventを使用している場合は、このhttps://stackoverflow.com/help/how-to-answer – Rob

+0

を確認お勧めします何を意味するのかわからないんだけどdocsを使用する前にジント/イベントレットコードを実行する前にコードに挿入する必要があります。モンキーパッチは低レベルのコールをノンブロッキングにします。 テクニック2は、Pythonのネイティブスレッドで動作します。サルがそれにパッチを当てなければ、それはブロックされます。モンキーパッチは、そのスレッド呼び出しの低レベル呼び出しを非ブロックにします。 (RTMS) – ionheart

関連する問題