main.py 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import pandas as pd
  2. import importlib
  3. import concurrent.futures
  4. from utils.jsonUtil import JsonUtil
  5. from algorithmContract.confBusiness import ConfBusiness
  6. from algorithm.dataProcessor import DataProcessor
  7. from behavior.baseAnalyst import BaseAnalyst
  8. from behavior.analyst import Analyst
  9. import seaborn as sns
  10. sns.set_style("darkgrid")
  11. def buildDynamicInstance(module_path, class_name, confData: ConfBusiness):
  12. # 动态导入模块
  13. module = importlib.import_module(module_path)
  14. # 获取类
  15. cls = getattr(module, class_name)
  16. # 创建类实例
  17. instance = cls(confData)
  18. return instance
  19. def dynamic_instance_and_call(module_path, class_name, method_name, *args, **kwargs):
  20. # 动态导入模块
  21. module = importlib.import_module(module_path)
  22. # 获取类
  23. cls = getattr(module, class_name)
  24. # 创建类实例
  25. instance = cls()
  26. # 获取方法
  27. method = getattr(instance, method_name)
  28. # 调用方法
  29. method(*args, **kwargs)
  30. def loadJson(filePath):
  31. # 打开并读取JSON文件
  32. with open(filePath, 'r') as f:
  33. data = JsonUtil.read_json(filePath)
  34. return data
  35. def executeAnalysis(config):
  36. configBusinessFilePath=config["configFilePath"]
  37. print(configBusinessFilePath)
  38. businessConfig=ConfBusiness()
  39. configBusiness = businessConfig.loadConfig(configBusinessFilePath)
  40. baseAnalysts=[]
  41. noCustomFilterAnalysts = []
  42. analysts = []
  43. for dynamicAnalyst in config["configAnalysis"]:
  44. package = dynamicAnalyst["package"]
  45. className = dynamicAnalyst["className"]
  46. methodName = dynamicAnalyst["methodName"]
  47. analyst = buildDynamicInstance(package, className, configBusiness)
  48. analysts.append(analyst)
  49. process = DataProcessor()
  50. for analyst in analysts:
  51. process.attach(analyst)
  52. process.execute(configBusiness)
  53. for analyst in analysts:
  54. process.detach(analyst)
  55. if __name__ == "__main__":
  56. configs = loadJson(r"conf/conf.json")
  57. for config in configs:
  58. executeAnalysis(config)
  59. # 使用多线程时,matplotlib绘图报错
  60. # 在使用Python语言的matplotlib包时,如果尝试在多线程环境中创建图形界面,你可能会遇到“QWidget-: Must construct a QApplication before a QWidget”的错误。
  61. # 这个错误通常是因为matplotlib的图形后端(backend)依赖于Qt框架,而Qt框架要求在一个QApplication实例被创建之后再创建任何QWidget对象。
  62. # 在多线程环境中,每个线程都应该有一个它自己的事件循环。然而,QApplication实例通常是全局的,并且应该只在主线程中创建一次。
  63. # 如果你尝试在一个非主线程中创建QApplication或者QWidget,就会遇到这个问题。
  64. # with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
  65. # futures=[executor.submit(executeAnalysis, config) for config in configs]
  66. # for future in concurrent.futures.as_completed(futures):
  67. # try:
  68. # result = future.result()
  69. # except Exception as exc:
  70. # print(f'生成异常: {exc}')
  71. # else:
  72. # print(f'任务返回结果: {result}')