multiprocessing—Python并发执行多个cmd命令

该博客介绍了如何利用Python的multiprocessing模块并行执行多个CMD命令,同时解决了并行执行时的日志记录问题。通过创建多个进程,实现了对bat脚本中cmd命令的并行调用,每个命令的执行结果被写入相应的日志文件,确保了任务的并发执行和日志记录的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python如何并发执行多个函数?

  • 使用该包实现多进程执行cmd命令:multiprocessing
  • 代码目的:解决bat脚本并行运行cmd命令时无法生成日志问题,用python实现并行执行cmd命令并生成日志。
import os
import re
import time
import datetime
from multiprocessing import Process     #导multiprocessing包


def cz_part_one():
    time.sleep(1)
    #将运行的cmd命令存放在列表里
    cmd_list = [
        "F:\\111\\chengshang\\0530\\javaForWindowsx64\\jre\\bin\\java.exe -Xms512m -Xmx1024m -jar  F:\\111\\chengshang\\0530\\javaForWindowsx64\\autoCompile.jar -c F:\\111\\chengshang\\0530\\javaForWindowsx64,subSystem=authGate_DEVELOP,product=XM-TEST,subSysVersioniterVersion=1auth-shijian-IT,productVersion=EMP,source_code_path=project_path:F:\\111\\lanyuan-notebook-3.1v-first##class_path:F:\\111\\lanyuan-notebook-3.1v-first  F:\\111\\chengshang\\0530\\javaForWindowsx64\\ComplierPath1.xml",
        "F:\\111\\chengshang\\0530\\javaForWindowsx64\\jre\\bin\\java.exe -Xms512m -Xmx1024m -jar  F:\\111\\chengshang\\0530\\javaForWindowsx64\\autoCompile.jar -c F:\\111\\chengshang\\0530\\javaForWindowsx64,subSystem=authGate_DEVELOP,product=XM-TEST,subSysVersioniterVersion=1auth-shijian-IT,productVersion=EMP,source_code_path=project_path:F:\\111\\lanyuan-notebook-3.1v-second##class_path:F:\\111\\lanyuan-notebook-3.1v-second  F:\\111\\chengshang\\0530\\javaForWindowsx64\\ComplierPath2.xml",
        "F:\\111\\chengshang\\0530\\javaForWindowsx64\\jre\\bin\\java.exe -Xms512m -Xmx1024m -jar  F:\\111\\chengshang\\0530\\javaForWindowsx64\\autoCompile.jar -c F:\\111\\chengshang\\0530\\javaForWindowsx64,subSystem=lebank_DEVELOP,product=XM-TEST,subSysVersioniterVersion=3lebank-shijian-IT,productVersion=EMP,source_code_path=project_path:F:\\111\\lanyuan-notebook-3.1v-first2##class_path:F:\\111\\lanyuan-notebook-3.1v-first2  F:\\111\\chengshang\\0530\\javaForWindowsx64\\ComplierPath5.xml"]
    for cmd in cmd_list:    #遍历列表
        dtime = datetime.datetime.now().strftime('%Y%m%d%H%M%S')         #获取系统当前时间
        kcmd = re.sub('shijian', dtime, cmd)         #使用正则替换cmd命令中的变量参数
        print(kcmd)                    #kcmd是要执行的命令,这样打印是为了观察与cz_part_one函数是否是并行执行命令
        with os.popen(kcmd, "r") as p:       #执行命令
            r = p.read()       #r是执行结果,可输出打印到控制台
            subSysVersioniterVersion = kcmd.split(',')[3].split('=')[-1]
            file_handle = open("F:\\111\\chengshang\\1\\" + subSysVersioniterVersion + ".txt",
                               mode='a+')  # mode=a+  可读可追加  mode=w 可写并覆盖原来内容  F:\\111\\chengshang\\1\\:生成路径
            file_handle.write(str(r) + "\n")      #将控制台执行结果保存当txt文件
            file_handle.close()

def cz_part_two():
    time.sleep(2)
    cmd_list = [
        "F:\\111\\chengshang\\0530\\javaForWindowsx64\\jre\\bin\\java.exe -Xms512m -Xmx1024m -jar  F:\\111\\chengshang\\0530\\javaForWindowsx64\\autoCompile.jar -c F:\\111\\chengshang\\0530\\javaForWindowsx64,subSystem=mobilebank_DEVELOP,product=XM-TEST,subSysVersioniterVersion=1mobi2lebank-shijian-IT,productVersion=EMP,source_code_path=project_path:F:\\111\\lanyuan-notebook-3.1v-first1##class_path:F:\\111\\lanyuan-notebook-3.1v-first1  F:\\111\\chengshang\\0530\\javaForWindowsx64\\ComplierPath3.xml",
        "F:\\111\\chengshang\\0530\\javaForWindowsx64\\jre\\bin\\java.exe -Xms512m -Xmx1024m -jar  F:\\111\\chengshang\\0530\\javaForWindowsx64\\autoCompile.jar -c F:\\111\\chengshang\\0530\\javaForWindowsx64,subSystem=mobilebank_DEVELOP,product=XM-TEST,subSysVersioniterVersion=1mobi2lebank-shijian-IT,productVersion=EMP,source_code_path=project_path:F:\\111\\lanyuan-notebook-3.1v-second1##class_path:F:\\111\\lanyuan-notebook-3.1v-second1  F:\\111\\chengshang\\0530\\javaForWindowsx64\\ComplierPath4.xml",
        "F:\\111\\chengshang\\0530\\javaForWindowsx64\\jre\\bin\\java.exe -Xms512m -Xmx1024m -jar  F:\\111\\chengshang\\0530\\javaForWindowsx64\\autoCompile.jar -c F:\\111\\chengshang\\0530\\javaForWindowsx64,subSystem=lebank_DEVELOP,product=XM-TEST,subSysVersioniterVersion=3lebank-shijian-IT,productVersion=EMP,source_code_path=project_path:F:\\111\\lanyuan-notebook-3.1v-second2##class_path:F:\\111\\lanyuan-notebook-3.1v-second2  F:\\111\\chengshang\\0530\\javaForWindowsx64\\ComplierPath6.xml"]
    for cmd in cmd_list:
        dtime = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
        kcmd = re.sub('shijian',dtime,cmd)
        print(kcmd)
        with os.popen(kcmd, "r") as p:
            r = p.read()
            subSysVersioniterVersion = kcmd.split(',')[3].split('=')[-1]
            file_handle = open("F:\\111\\chengshang\\2\\" + subSysVersioniterVersion + ".txt",
                               mode='a+')  # mode=a+  可读可追加  mode=w 可写并覆盖原来内容
            file_handle.write(str(r) + "\n")
            file_handle.close()

if __name__ == "__main__":
	#实现并行执行2个函数
    Process(target=cz_part_one).start()       
    Process(target=cz_part_two).start()


 注:
     2个函数下面设置的间隔时间适用于解决执行程序错乱问题,若无此场景可删
Python中实现程序多开(通常指并发执行),有多种方法,包括但不限于进程池(multiprocessing)、线程池(threading)、异步I/O(asyncio)以及第三方库如`subprocess`等。以下是其中的一些基本介绍: 1. **进程池(multiprocessing)**: Python标准库`multiprocessing`模块提供了一个进程池,允许你一次性提交一组任务到进程池,然后等待它们全部完成。这适用于CPU密集型任务,因为每个任务都会在单独的进程中运行,互不影响。 ```python from multiprocessing import Pool def worker(num): # 这里是你的工作函数 pass with Pool(processes=4) as p: results = p.map(worker, range(5)) ``` 2. **线程池(threading)**: 对于IO密集型任务,线程池(`concurrent.futures.ThreadPoolExecutor`)更适合,因为它利用了操作系统支持的多线程机制,但要注意线程安全的问题。 ```python from concurrent.futures import ThreadPoolExecutor with ThreadPoolExecutor(max_workers=4) as executor: future_to_url = {executor.submit(worker, url): url for url in urls} for future in futures.as_completed(future_to_url): url = future_to_url[future] data = future.result() ``` 3. **异步I/O(asyncio)**: 当涉及到网络请求或其他阻塞操作时,`asyncio`库能更好地管理事件循环,避免长轮询。适合高并发场景。 ```python import asyncio async def fetch(url): # 异步网络请求 response = await aiohttp.request("GET", url) return await response.text() loop = asyncio.get_event_loop() tasks = [fetch(url) for url in urls] responses = await asyncio.gather(*tasks) ``` 4. **子进程(subprocess)**: 如果你需要完全独立的进程实例,可以使用`subprocess`模块,如执行外部命令或创建独立的Python进程。 ```python import subprocess process_list = [] for cmd in commands: process = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True) process_list.append(process) ``` 每种方法都有其优缺点,具体取决于你的应用需求和资源限制。在实际使用中,要考虑线程/进程同步、锁、资源消耗等问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值