繁体   English   中英

Python中的多线程Falcon

[英]Multithreading Falcon in Python

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

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

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

但是即使是这样,将Web服务器用于长时间运行的任务也不是一个好主意。 长时间运行的任务应由其他一些辅助进程运行。

看看芹菜

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中可用的应用程序对象app。

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

如果这种方法不适合您的需求,那么我认为您应该使用Tornado而不是Falcon

让我知道是否需要进一步澄清。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM