首页 > 开发 > Python > 正文

python多进程重复加载的解决方式

2020-07-28 13:45:45
字体:
来源:转载
供稿:网友

flask多进程会引起重复加载,

解决方法:把耗资源的加载挪到函数里面或者类里面,就不会重复加载资源了。

测试发现,不是flask引起的,是多进程会引起重复加载python文件。

把flask注释掉,也会重复加载。

# autotrade/__init__.py# __init__.py 定义全局的app路由# 然后将其他模块由app装饰后的函数导入,flask即可识别所有的请求入口import time from flask import Flaskfrom multiprocessing import Process # 配置全局app # 导入index中定义的所有函数# from autotrade.server.index import *print("import will repeat")def run_index():  print("run_index once")  app = Flask(__name__)  # 启动web服务器,使用多线程方式,接收所有http请求  app.run(host='0.0.0.0', port=5000, threaded=True,debug=False) def run_orders():  # 启动查询交易程序  while True:    print('执行相应的交易程序')    time.sleep(3) def main():  # 主程序  # 创建子进程  jobs = []  jobs.append(Process(target=run_index))  # jobs.append(Process(target=run_orders))  # 启动子进程  for job in jobs:    job.start()   # 等待子进程结束返回  for job in jobs:    job.join() if __name__ == '__main__':  # run_index()  main()

一般情况,把需要加载的封装到函数或者类中就可以了,

但是有一个例外:就是SQLAlchemy

必须在py文件中实例化,

from flask_login import LoginManagerfrom flask_mail import Mailfrom flask_socketio import SocketIOfrom flask_migrate import Migratefrom flask_rq2 import RQfrom flask_wtf.csrf import CSRFProtectfrom monitor.common.storage import LocalStorage, QiniuStorage, ObjectStorageimport config.global_var as gl_var# from monitor.common.es_search import ESearchEngineQINIU_AVAILABLE = gl_var.get_value("qiniu_available")OSS_AVAILABLE = gl_var.get_value("oss_available")REDIS_URI = gl_var.get_value("redis_uri")BASEDIR = gl_var.get_value("basedir")sbdwl = gl_var.get_value("sbdwl")class Redis(object):  def __init__(self):    self._db = None  def init_app(self, uri=REDIS_URI):    self._db = _redis.Redis.from_url(uri)  @property  def db(self):    return self._dbprint("import foundation")import threadingclass Singleton(object):  _instance_lock=threading.Lock()  def __init__(self):    pass    # import time    # print("sleep")    # time.sleep(1)  def __new__(cls, *args, **kwargs):    if not hasattr(Singleton,"_instance"):      with Singleton._instance_lock:        if not hasattr(Singleton,"_instance"):          print("create _instance----------------------------")          Singleton._instance=object.__new__(cls,*args,**kwargs)          app = Flask(__name__)          Singleton._instance.db = SQLAlchemy(app)          Singleton._instance.login_manager = LoginManager()

解决方法:把启动换到一个新文件,然后在函数中调用这个文件,import也放在函数内部。

以上这篇python多进程重复加载的解决方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持错新网之家。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表