Python多进程无法控制多个长时间运行的控制台exe?

1 投票
2 回答
1705 浏览
提问于 2025-04-16 18:20

我刚开始学Python,最近我想用Python脚本去调用一个控制台的exe程序,这个程序需要很长时间才能完成。我希望这个exe程序能尽可能多地被调用,直到CPU的负载达到极限。而且当这个exe完成工作后,它应该把CPU释放给其他新的任务。所以我觉得我可能需要一个多进程控制的机制。

因为多进程只能调用Python的可调用函数,不能直接调用控制台的exe程序。我把subprocess.Popen(cmd)封装在一个Python函数里。但是,问题是当我使用multiprocessing.Process.start()之前,这个exe程序就已经开始运行了。而且在它完成之前(需要很长时间),它不会把控制权还给我,导致程序卡住在那儿。这不是我想要的结果。

我把代码贴在下面:

import sys 

import os 

import multiprocessing 

import subprocess  

def subprocessExe(cmd):

        return subprocess.call(cmd, shell=False, stdout=subprocess.PIPE, \
                               stderr=subprocess.PIPE,creationflags=0x08000000)

if __name__ == '__main__': 

        p = multiprocessing.Process(target=self.subprocessExe(exeFileName))

        p.start()

        print p, p.is_alive()

谢谢你的时间!

2 个回答

1

你的测试案例中有很多问题。以下这些对我来说是有效的:

import multiprocessing, subprocess

def subprocessExe(cmd):
   subprocess.call([cmd], shell=False)

p = multiprocessing.Process(target=subprocessExe, args=('/full/path/to/script.sh',))
p.start()

或者

subprocess.call([cmd], shell=True)
p = multiprocessing.Process(target=subprocessExe, args=('script.sh',))

或者

subprocess.Popen([cmd], shell=True, stdout=subprocess.PIPE, \
                               stderr=subprocess.PIPE)
2

你在创建 multiprocessing.Process 对象的时候调用了 subprocessExec。其实你应该这样做:

p = multiprocessing.Process(target=subprocessExec, args=(exeFileName,))

这样做之后就应该能正常工作了。

撰写回答