4

我正在使用Falcon为应用程序创建 REST API 。在不同端点上向 API 发起两个或多个请求时,没有多线程执行(必须完成一个请求才能执行下一个请求)

问题来自执行复杂机器学习过程(需要几十秒才能完成)的 POST 端点,并且在执行该过程时整个 API 被阻塞,因为它等待该过程完成以返回一些结果。

我正在使用 wsgiref simple_server 来处理请求:

if __name__ == '__main__':
    httpd = simple_server.make_server('127.0.0.1', 8000, app)
    httpd.serve_forever()

有什么方法可以使执行并行以同时服务多个请求。

4

3 回答 3

2

可能服务器未在多进程或多线程模式下运行。

但即使是这样,为长时间运行的任务占用 Web 服务器也不是一个好主意。长时间运行的任务应该由其他一些工作进程运行。

看看芹菜

于 2016-11-20T20:24:13.263 回答
1

zaher ideally you should use Celery as giorgosp mention but if it is mandatory to return result for API request then you can use Gunicorn

gunicorn --workers 3 -b localhost:8000 main:app --reload

Here, in above code I have mention 3 workers so at a time you can serve/process 3 requests.

Ideally no of workers can be

cpu_count * 2 + 1

You can use any port number you like, but make sure that it is above 1024 and it's not used by any other program.

The main:app option tells Gunicorn to invoke the application object app available in the file main.py.

Gunicorn provides an optional --reload switch that tells Gunicorn to detect any code changes on the fly. This way you can change your code without having to restart Gunicorn.

And if this approach is not suitable for your need than I think you should use Tornado instead of Falcon.

Let me know if any further clarification needed.

于 2017-03-05T16:50:34.260 回答
0

这可以通过将 Falcon 与Gunicorn耦合来轻松实现。使用 Gunicorn,无需实现 Celery 就可以相对容易地实现多线程/多处理(尽管没有什么可以阻止实现它。Celery 很棒!)

gunicorn -b localhost:8000 main:app --threads 3 --workers 3 --reload

上面的命令将加速 3 个工作人员,每个工作人员有 3 个线程。作为开发人员,您可以调整所需的工作人员和线程的数量。我强烈建议在调整这些设置之前了解多线程和多处理之间的区别。

于 2018-07-03T02:07:22.917 回答