我问是因为我想知道是否可以使用文本文件作为简单应用程序的数据存储。如果每个处理程序都运行完成,那么我应该能够在该请求期间修改文本文件而不必担心冲突,假设我在每个请求结束时关闭文件。
这可行吗?为了将文本文件用作 Flask 应用程序中的数据存储,我需要做些什么特别的事情吗?
归根结底,一个 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 协议决策...
线程支持或缺乏线程支持也依赖于服务器。可以并行运行多个请求的服务器还应该提供以单线程方式运行应用程序的选项,以便非线程安全的应用程序或框架仍然可以与该服务器一起使用。
因此,如果您真的希望在单线程模式下运行 Flask 应用程序,则需要查看您的特定服务器和/或模块以了解 WSGI 应用程序是如何运行的。服务器/模块可能有办法将您的应用程序配置为在单个线程中运行。
Regarding whether forcing a single-threaded system and storing items in a text file is a good idea, that's pretty subjective.
我相当肯定没有任何保证。但是,这取决于您运行应用程序的方式。例如,如果您使用 Heroku+gunicorn,则不会保留 Heroku 上在请求期间更改的所有文件,即文件是短暂的。因此,如果您要更改文本文件,更改将不会持续到下一个请求。另一个提供者 PythonAnywhere 对他们的文件系统没有那么严格,但同样,请求不能保证在下一个开始之前完成一个请求。此外,对于现代 Web 服务器,这将是一个无用的应用程序(或更准确地说是服务器)。
此外,如果您想要一个小型数据库,只需使用 sqlite。只要它安装在系统上,python 就带有一个与之交互的库(如果我没记错的话)。