12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- import pandas as pd
- import importlib
- import concurrent.futures
- from utils.jsonUtil import JsonUtil
- from algorithmContract.confBusiness import ConfBusiness
- from algorithm.dataProcessor import DataProcessor
- from behavior.baseAnalyst import BaseAnalyst
- from behavior.analyst import Analyst
- import seaborn as sns
- sns.set_style("darkgrid")
- def buildDynamicInstance(module_path, class_name, confData: 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()
- 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)
- analysts.append(analyst)
-
- process = DataProcessor()
- for analyst in analysts:
- process.attach(analyst)
- process.execute(configBusiness)
- 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}')
|