Параллельные вычисления с joblib во Flask - PullRequest
0 голосов
/ 24 мая 2018

У меня есть python функция, которую мне нужно вызывать повторно с разными значениями аргументов.Я хотел бы выполнить это параллельно на нескольких процессорах.Я сделал это успешно с помощью модуля joblib.Теперь я хотел бы сделать мой код доступным как веб-приложение, использующее flask, работающее на AWS EC2 instance с несколькими ЦП.Вот забавный пример того, что я пробовал:

from flask import Flask
from joblib import Parallel, delayed
from time import sleep

def myfunc(x):
    sleep(5)
    return x

application = Flask(__name__)

@application.route('/', methods = ['GET'])
def getresult():
    out = Parallel(n_jobs=-1, verbose=10)(delayed(myfunc)(i) for i in range(5))
    return str(sum(out))

if __name__ == "__main__":
    application.debug = True
    application.run()

Проблема в том, что этот код не работает параллельно на нескольких процессорах.Я получаю следующее предупреждение и вывод (истекшее время подтверждает, что он не работает параллельно):

    /Library/anaconda/lib/python3.6/site-packages/joblib/parallel.py:547:
    UserWarning: Multiprocessing-backed parallel loops cannot be nested below 
    threads, setting n_jobs=1
      **self._backend_args)
    [Parallel(n_jobs=-1)]: Done   1 out of   1 | elapsed:    5.0s remaining:    0.0s
    [Parallel(n_jobs=-1)]: Done   2 out of   2 | elapsed:   10.0s remaining:    0.0s
    [Parallel(n_jobs=-1)]: Done   3 out of   3 | elapsed:   15.0s remaining:    0.0s
    [Parallel(n_jobs=-1)]: Done   4 out of   4 | elapsed:   20.0s remaining:    0.0s
    [Parallel(n_jobs=-1)]: Done   5 out of   5 | elapsed:   25.0s remaining:    0.0s
    [Parallel(n_jobs=-1)]: Done   5 out of   5 | elapsed:   25.0s finished

Есть предложения?

1 Ответ

0 голосов
/ 24 мая 2018

Посмотрите на предупреждение пользователя:

UserWarning: Multiprocessing-backed parallel loops cannot be nested below 
threads, setting n_jobs=1

Может быть, это поможет:

Многопроцессорные параллельные циклы с поддержкой не могут быть вложены в потоки, устанавливая n_jobs = 1

Flask, вероятно, раскручивает свои собственные потоки под капотом, поэтому ваш getresult () может не работать в MainThread.

...