| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- import pandas as pd
- from algorithm.utils.jsonUtil.jsonUtil import JsonUtil
- import concurrent.futures
- import confBusiness
- import importlib
- from algorithm.dataProcessor import DataProcessor
- from algorithm.baseAnalyst import BaseAnalyst
- from algorithm.analyst import Analyst
- import seaborn as sns
- sns.set_style("darkgrid")
- def buildDynamicInstance(module_path, class_name, confData: confBusiness.ConfBusiness):
- # 动态导入模块
- module = importlib.import_module(module_path)
- # 获取类
- cls = getattr(module, class_name)
- # 创建类实例
- instance = cls(confData)
- return instance
- def dynamic_instance_and_call(module_path, class_name, method_name, *args, **kwargs):
- # 动态导入模块
- module = importlib.import_module(module_path)
- # 获取类
- cls = getattr(module, class_name)
- # 创建类实例
- instance = cls()
- # 获取方法
- method = getattr(instance, method_name)
- # 调用方法
- method(*args, **kwargs)
- def loadJson(filePath):
- # 打开并读取JSON文件
- with open(filePath, 'r') as f:
- data = JsonUtil.read_json(filePath)
- return data
- def executeAnalysis(config):
- configBusinessFilePath=config["configFilePath"]
- print(configBusinessFilePath)
- businessConfig=confBusiness.ConfBusiness()
- configBusiness = businessConfig.loadConfig(configBusinessFilePath)
- baseAnalysts=[]
- noCustomFilterAnalysts = []
- analysts = []
- for dynamicAnalyst in config["configAnalysis"]:
- package = dynamicAnalyst["package"]
- className = dynamicAnalyst["className"]
- methodName = dynamicAnalyst["methodName"]
- analyst = buildDynamicInstance(package, className, configBusiness)
-
- if not isinstance(analyst,Analyst) and isinstance(analyst ,BaseAnalyst):
- baseAnalysts.append(analyst)
- else :
- if isinstance(analyst,Analyst):
- analysts.append(analyst)
- process = DataProcessor()
- for analyst in baseAnalysts:
- process.attachBaseAnalyst(analyst)
- for analyst in analysts:
- process.attach(analyst)
- process.execute(configBusiness)
- for analyst in baseAnalysts:
- process.detachBaseAnalyst(analyst)
- for analyst in analysts:
- process.detach(analyst)
- if __name__ == "__main__":
- configs = loadJson(r"conf/conf.json")
- for config in configs:
- executeAnalysis(config)
- # 使用多线程时,matplotlib绘图报错
- # 在使用Python语言的matplotlib包时,如果尝试在多线程环境中创建图形界面,你可能会遇到“QWidget: Must construct a QApplication before a QWidget”的错误。
- # 这个错误通常是因为matplotlib的图形后端(backend)依赖于Qt框架,而Qt框架要求在一个QApplication实例被创建之后再创建任何QWidget对象。
- # 在多线程环境中,每个线程都应该有一个它自己的事件循环。然而,QApplication实例通常是全局的,并且应该只在主线程中创建一次。
- # 如果你尝试在一个非主线程中创建QApplication或者QWidget,就会遇到这个问题。
-
- # with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
- # futures=[executor.submit(executeAnalysis, config) for config in configs]
- # for future in concurrent.futures.as_completed(futures):
- # try:
- # result = future.result()
- # except Exception as exc:
- # print(f'生成异常: {exc}')
- # else:
- # print(f'任务返回结果: {result}')
|