【问题标题】:Running Multiple Python Scripts Using importlib使用 importlib 运行多个 Python 脚本
【发布时间】:2019-09-02 23:50:08
【问题描述】:

我有一个 Python 脚本,它基本上运行一个每日数据提取过程,该过程在该脚本中运行 20 个脚本。每个子脚本都运行一个 sql 查询。

我在任务调度程序上有脚本,该脚本从凌晨 3 点开始,大约 2 小时后结束。

我想提高这个脚本的速度并同时运行所有的脚本。

我研究过线程和多处理,但我对这些概念和一般计算机科学还比较陌生。进行此过程的最佳方法是什么?


import os
import sys
import importlib
import pandas as pd

# Key folder names and locations
# Main folder location
daily_data_path = 'Desktop:\\Daily_Data' 

# Login folder name - must be saved in your desktop and must contain a module called login.py
login_folder = 'Login'

# Login folder location
login_folder_path = os.path.expanduser('~') + '\\Desktop\\' + login_folder

# Direct Python to the correct directories
sys.path.append(daily_data_path)
sys.path.append(login_folder_path)

# Function to dynamically import and run each script
def script_import(path_name):

    try:
        importlib.__import__(path_name)         
        run_ind = '1'
    except:
        run_ind = '0'

# List of daily data paths to iterate over
paths = ['script1.Scripts.script1,
         'script2.Scripts.script2,
         ....,
         'script20.Scripts.script20
        ]


for path in paths:

    # Call the script_import function to run the daily data process
    script_import(path)          

【问题讨论】:

  • 你用过库线程吗?

标签: python sql python-multiprocessing python-multithreading python-importlib


【解决方案1】:

您可以使用来自multiprocessing 模块的工作人员池,以便在单独的进程中执行脚本。 Pool 类提供map_async 方法,其工作方式类似于内置的map 函数,但并行执行所有操作。代码可能如下所示:

import importlib
import multiprocessing


def script_import(name):
    importlib.import_module(name)


if __name__ == '__main__':
    # List of daily data paths to iterate over
    paths = []

    # create process pool
    procpool = multiprocessing.Pool()

    # apply 'script_import' function in parallel
    result = procpool.map_async(script_import, paths)

    # close the pool and wait for processes to complete
    procpool.close()
    procpool.join()

【讨论】:

    【解决方案2】:

    听起来你的子脚本可以独立于主脚本运行,我建议使用subprocess.Popen,例如

    from subprocess import Popen
    import sys
    cmnds = [... a list of commands to execute ...]
    tasks = [Popen(cmnd) for cmnd in cmnds]
    result = sum([task.wait() for task in tasks])
    sys.exit(result)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2021-11-30
      • 2023-03-07
      • 2017-12-12
      • 1970-01-01
      • 2021-07-23
      • 2021-12-19
      相关资源
      最近更新 更多