Using multiprocessing with gunicorn in Flask application

Viewed 2640

I made a basic flask application using Gunicorn with worker class gevent. The issue I ran into was as follows. If I had a basic flask app like this:

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)

And I took two techniques at it, technique 1 will break gunicorn if I run it like:

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

but technique 2 won't. I see this is because technique 1 relies on multiprocessing and technique 2 relies on threads, but I can't figure out why a gevent worker class doesn't allow for a pool?

1 Answers
Related