Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 实现真正多线程的替代方案?_Python_Multithreading_Flask - Fatal编程技术网

Python 实现真正多线程的替代方案?

Python 实现真正多线程的替代方案?,python,multithreading,flask,Python,Multithreading,Flask,我使用Flask微框架实现了一个多线程web服务器。基本上,我的服务器有一个任务队列和一个线程池。因此,它可以处理多个请求。因为Flask是用Python实现的,Python线程不是真正的并发线程,所以我的web应用程序有点滞后 有没有替代烧瓶的方法来克服多线程问题 这不是Flask的错,这是Python解释器中的一个限制,因此您使用的任何框架都将受到它的约束 但是有一个很好的方法可以避免这个问题。要实现真正的并发,可以使用进程池而不是线程。该模块提供了一个与线程模块兼容的API,但它为工人创建

我使用Flask微框架实现了一个多线程web服务器。基本上,我的服务器有一个任务队列和一个线程池。因此,它可以处理多个请求。因为Flask是用Python实现的,Python线程不是真正的并发线程,所以我的web应用程序有点滞后


有没有替代烧瓶的方法来克服多线程问题

这不是Flask的错,这是Python解释器中的一个限制,因此您使用的任何框架都将受到它的约束


但是有一个很好的方法可以避免这个问题。要实现真正的并发,可以使用进程池而不是线程。该模块提供了一个与线程模块兼容的API,但它为工人创建了子进程。我使用此模块为Flask应用程序创建了后台工作人员,并发现它工作得非常好。

我遇到了这个问题,我有点失望,因为没有人指出Flask(以及大多数python web应用程序是如何部署的)。见:

我首选的部署选项是super simple,它在Linux和Windows上同样适用(如果我将它部署在现有网站旁边,或者甚至是作为现有网站的一部分进行混合部署,我通常使用IIS应用程序请求路由[ARR]作为Tornado的反向代理)。我在这两个方面都使用了gevent,并取得了巨大成功

Tornado是一个开源版本的可扩展、无阻塞的web服务器和为FriendFeed提供动力的工具。因为它是非阻塞的,并且使用epoll,所以它可以处理数千个同时存在的连接,这意味着它是实时web服务的理想选择。将此服务与Flask集成非常简单:

因此,如果您的flask应用程序位于yourapplication.py中,您可以创建另一个名为tornado_web.py的应用程序,并使用它为您的应用程序提供如下服务:

from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from yourapplication import app

http_server = HTTPServer(WSGIContainer(app))
http_server.listen(5000)
IOLoop.instance().start()

via:

现在趋势中有一个新的包,它对生产也很健壮,它是用python实现的,并且易于理解。请看一看。

您以何种方式部署烧瓶?不要忘记,Python中的多线程非常适合您正在尝试做的事情。视图的“laggy”部分可能是web服务或数据库调用,或者是设置不正确的web服务器,该服务器正在为每个请求创建Python进程。无论实际问题是什么,我们都不知道如何通过您提供的细节来帮助您解决问题。此外,询问Flask的替代方案基本上是询问工具的建议,这不是StackOverflow设计用来处理的问题,因为有多种可能的答案。正如您所提到的,我正在为每个请求创建一个流程。但我无法避免它,因为web服务公开了一个文本到语音(TTS)系统,它是作为一个单独的二进制文件实现的。为了与TTS进程交互,我使用了pexpect模块。所以,对于每个请求,线程池中现有的空闲线程将使用pexpect生成TTS进程。我知道设计有点奇怪。下面是当前实现的链接。我很欣赏任何改进当前设计的建议。我所说的laggy的意思是“即使队列中有任务,线程池中有空闲线程,也需要4-6秒才能处理它们”。我认为这可能是因为多个线程按顺序完成了大量工作(请求、响应、切换TTS进程、管理任务队列)。这个结论我错了吗?回答了同样的问题:我刚刚在我的应用程序上安装了tornado(如前所述,Starlight forward),但是我错过了flask默认服务器的帮助日志,控制台上的呼叫一直在重复-你知道如何在tornado中做到这一点吗@奥隆