Python中的多线程猎鹰

时间:2016-11-02 07:36:03

标签: python multithreading falconframework

我正在使用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()

有没有办法让执行并行同时为多个请求提供服务。

3 个答案:

答案 0 :(得分:2)

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

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

查看Celery

答案 1 :(得分:1)

zaher理想情况下,您应该使用Celery作为giorgosp提及,但如果必须返回API请求的结果,那么您可以使用Gunicorn

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

在这里,我在上面的代码中提到了3个工作人员,所以你可以同时服务/处理3个请求。

理想情况下,没有工人可以

  

cpu_count * 2 + 1

您可以使用自己喜欢的任何端口号,但要确保它高于1024,并且任何其他程序都不会使用它。

main:app选项告诉Gunicorn调用main.py文件中可用的应用程序对象应用程序。

Gunicorn提供了一个可选的--reload开关,告诉Gunicorn动态检测任何代码更改。这样您就可以更改代码而无需重新启动Gunicorn。

如果这种方法不适合您的需要,我认为您应该使用Tornado代替Falcon

如果需要进一步澄清,请告诉我。

答案 2 :(得分:0)

通过将Falcon与Gunicorn耦合可以轻松实现。借助Gunicorn,无需实施Celery即可相对轻松地实现多线程/多处理(尽管什么也不能阻止它的实现。Celery太棒了!)

{{1}}

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