另一个请求开始之前Flask请求是否运行完成?

时间:2013-01-07 19:38:35

标签: python flask

我问,因为我想知道我是否可以使用文本文件作为简单应用程序的数据存储。如果每个处理程序运行完成,那么看起来我应该能够在该请求期间修改文本文件而不用担心冲突,假设我在每个请求结束时关闭文件。

这可行吗?为了在Flask应用程序中将文本文件用作数据存储,我需要做些什么特别的事情吗?

2 个答案:

答案 0 :(得分:7)

最后,Flask应用程序是一个WSGI应用程序,这意味着它只是一个看起来像这样的Python函数......

def simple_app(environ, start_response):
    # environ is a dict, start_response is a callable.
    # This function should call start_response, then return an iterable of strings
    # that make up the body of the response.

Flask实现此功能的方式是调用flask包中的一堆其他函数,最终将控制权交给你。到那时,数据结构已经发生了变化,但整个过程只是一种轻松编写正确实现这一功能的代码的方法。

此功能由Web服务器调用(有时使用某些模块,例如Apache的modwsgi模块)。当然,必须将这一个宏函数加载到Python的某个实例中才能被调用。

假设您的Web服务器有一个wsgi模块。当Web服务器启动时,该模块将创建一个最多包含四个线程的Python进程。当一个新请求进入时,它会抓取一个未使用的线程,并在其上调用上述函数。然后,仍然在该线程内调用Flask的所有其余部分和应用程序的代码。但是,另一个请求调用相同的函数,但现在在另一个线程中。这样做的原因是因为Flask明确地使得可以在这样的多线程模式下运行,但Flask实际上并不控制它是否在多个线程中运行。当然,一个进程和四个线程完全是任意的:您的服务器可以很好地使用多个进程和每个进程十几个线程。或者一个进程和一个线程。

因此,真正的答案与Flask无关,因为Flask只是一个使用WSGI协议编写的应用程序。 WSGI protocol decision on Multi-Threading州......

  

线程支持或缺少线程支持也取决于服务器。服务器   可以并行运行多个请求,也应该提供   以单线程方式运行应用程序的选项,以便   仍然可以使用非线程安全的应用程序或框架   与该服务器。

因此,如果您真的希望以单线程模式运行Flask应用程序,则需要查看特定服务器和/或模块以了解WSGI应用程序的运行方式。服务器/模块可能有一种方法可以将应用程序配置为在单个线程中运行。

关于强制单线程系统和将项目存储在文本文件中是一个好主意,这是非常主观的。

答案 1 :(得分:2)

我很确定无法保证这一点。但是,这取决于您运行应用程序的方式。例如,如果您正在使用Heroku + gunicorn,则不会保留Heroku上在请求期间更改的所有文件,即文件是短暂的。因此,如果您要更改文本文件,更改将不会持续到下一个请求。另一个提供者PythonAnywhere对它们的文件系统并不是那么严格,但同样,请求在下一个启动之前无法保证完成。此外,对于现代Web服务器,这将是一个无用的应用程序(或更准确的服务器)。

此外,如果您想要一个小型数据库,只需使用sqlite。只要它安装在系统上,python就会附带一个与它交互的库(如果我没记错的话)。