【问题标题】:python multiprocessing can not control multiple long running console exe?python multiprocessing不能控制多个长时间运行的控制台exe?
【发布时间】:2011-09-02 01:15:53
【问题描述】:

我是 Python 的新手。我最近尝试使用 Python 脚本来调用控制台 exe,这是一个需要很长时间的过程。我将允许在 CPU 允许的范围内多次调用 exe。当 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()

感谢您的宝贵时间!

【问题讨论】:

    标签: python console subprocess multiprocessing exe


    【解决方案1】:

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

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

    然后它应该可以工作了。

    【讨论】:

    • 我试过这个。这是行不通的。 Python 自己的 forking.py 模块出错。
    • 我使用的正是你在那里写的。但我的文件名有一个空格。因为它后面有论据。所以我的“cmd”就像“*.exe xyz”。 subprocess.Popen 没有问题。但是,如果我将整个字符串“cmd”放在 multiprocessing.processing 的 arg 中。报“picklingerror”错误
    • 在 cmd 字符串中没有空格的情况下再次尝试。只有一个exe文件。它仍然报告该错误。我正在使用 python 2.6。
    【解决方案2】:

    您的测试用例中有很多问题。以下为我工作:

    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)
    

    【讨论】:

    • 您可能还想在 p.start() 之前添加p.daemon = True
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 2014-09-04
    相关资源
    最近更新 更多