【问题标题】:Flask - Multiprocessing issueFlask - 多处理问题
【发布时间】:2022-01-23 23:30:54
【问题描述】:

下面是我的烧瓶,多处理代码。如果我执行,我会打印两次“成功打开数据库”。如果我让 debug = True,我得到它三次。请帮助我了解我哪里出错了。

from flask import Flask
from multiprocessing import Manager
import sqlite3 as sql


app = Flask(__name__)


db_path = "D:/abc.db"

# reading the database
conn = sql.connect(db_path)
print ("Opened database successfully")
  

@app.route('/')
def func():
    print("Hello")    
    ## Instantiating Managers
    manager = Manager()
    return_list1 = manager.list()
    return_list2 = manager.list()
    
   
    return {}


if __name__=='__main__':
    app.run(debug = False, port=5003)

【问题讨论】:

  • 所有不在if __name__ == '__main__': 内的代码都将运行两次(您不需要将函数和类定义放在那里,因为它们不会被定义调用)
  • 1.为什么会运行两次?任何想法? 2. 我放代码的动机是使不可序列化的变量可用于所有服务方法。有没有其他方法可以做到这一点?
  • 它不一定会运行两次,它会随着新进程的启动而运行多次。为什么?因为每个新进程几乎只是运行同一个文件,可能是因为您将它设置为有一个目标,但该目标必须在同一个文件中定义,因此它重新运行整个代码并使用该名称。此外,内存不在进程之间共享,因此您不能这样做,将直接执行的所有内容放在if name == main 下,为了共享您需要使用管理器的数据(还有其他东西)并将其作为参数传递.以及为什么你还是要使用管理器?

标签: python flask multiprocessing


【解决方案1】:

我会推断您是在 Windows 或某些平台下运行的,这些平台使用操作系统 spawn 根据行为创建新进程。

在调用Manager() 时,会发生两件事:

  1. multiprocessing.managers.SyncManager 的新实例已创建并
  2. 在此实例上调用方法 start

调用start 会启动一个新进程。您创建的托管列表上的方法调用实际上是对代理对象的调用。实际的列表对象驻留在这个新的SyncManager 进程的地址空间中。您可能知道,当 spawn 用于创建新进程时,源程序中全局范围内的任何代码都会重新执行以初始化新进程。但是,__name__ 不会是新进程的 '__main__',因此您不希望在此初始化中执行的任何代码,因为它有害或完全不必要,都应该放在 if __name__ == '__main__': 块中。

因此,您在加载程序时打开一次 SQL 连接,然后在每次调用端点(或同一源中的任何端点)时再次打开。此外,您不必要地创建了太多 SyncManager 实例:

from flask import Flask
import sqlite3 as sql


app = Flask(__name__)


if __name__ == '__main__':
    from multiprocessing import Manager
    # reading the database
    db_path = "D:/abc.db"
    conn = sql.connect(db_path)
    print ("Opened database successfully")
    manager = Manager()
  

@app.route('/')
def func():
    print("Hello")    
    ## Instantiating Managers
    return_list1 = manager.list()
    return_list2 = manager.list()
    
   
    return {}


if __name__=='__main__':
    app.run(debug = False, port=5003)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 2015-05-26
    • 2016-08-28
    • 2022-06-17
    • 1970-01-01
    相关资源
    最近更新 更多