【问题标题】:how to control process in python?如何在python中控制进程?
【发布时间】:2015-11-01 13:33:28
【问题描述】:

我想在不给cpu太多工作的情况下并行运行多个进程,以便cpu也可以做其他工作。

在 python 中,我将使用 os.system 来调用一些二进制文件。这些调用是独立的,可以并行。但是这些二进制文件可能会运行不同的时间长度。

例如,我想做的是,始终保持其中 8 个并行运行,如果有人提前退出,则启动另一个。

我现在做的是这样的:

count = 0
for f in files:
    count = count + 1
    cmd = exe 
    if (count != 8):
        cmd = cmd + " &"
    else:
        count = 0
    os.sytem(cmd)

但是如果没有 & 的 cmd 运行时间过长或过短,这将是不理想的。

我也试过多处理模块,

p=Pool(8)
print(p.map(f,list_of_args))

但在这种情况下,我大部分时间都没有并行运行 8 个进程。由于其中一些提前退出。

不需要同步。

我有 16 个 cpu 核心,我想要其中的一半(8 个进程并行运行)

【问题讨论】:

    标签: python multithreading process parallel-processing multiprocessing


    【解决方案1】:

    您最好不要使用os.system,而是使用subprocess.Popen,因为它更强大、更安全。此外,subprocess.Popen 不会在通话时阻塞,因此您无需在命令末尾附加任何“&”。

    对于问题本身,您需要知道操作系统在自动平衡工作负载方面非常出色,因此您不必担心空闲进程与正在运行的进程。只需使用Pool 启动您的工作人员并让他们运行直到需要,而不必担心“浪费”任何资源。一个空闲的进程只需要一点内存就可以了。

    在改进代码时,您可能想要使用线程池而不是进程池。这是因为您的工作人员只是在等待其他工作人员完成,因此线程比进程更好。

    如果您可以使用 Python 3,类似这样的东西会为您完成这项工作。

    import subprocess
    from concurrent.futures import ThreadPoolExecutor
    
    
    def function(myfile):
        command = ('watever', 'you', 'want', 'to', 'do', 'with', myfile)
        process = subprocess.Popen(command, stdout=subprocess.PIPE)
        process.communicate()
    
    
    with ThreadPoolExecutor(max_workers=8) as executor:
        future = executor.map(function, files)
        future.result()
    

    【讨论】:

    • 我认为操作系统会使用这段代码进行上下文切换?假设文件是​​ 100000 个项目的列表,那么我可能需要等待很长时间才能完成其中一个项目,因为您需要进行大量上下文切换。
    • 如果您将工作人员的数量与 CPU 的数量配对,那么上下文切换的数量将是微不足道的。如果您生成了太多进程,则上下文切换可能会变得很明显。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 2013-01-13
    • 1970-01-01
    相关资源
    最近更新 更多