我正在使用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()
有没有办法让执行并行同时为多个请求提供服务。
答案 0 :(得分:2)
答案 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个线程。作为开发人员,您可以调整所需的工作程序和线程数。我强烈建议您在调整这些设置之前了解多线程与多处理之间的区别。