控制python代码在不同的核心上运行

时间:2017-11-18 17:24:26

标签: python multithreading multiprocessing

我的机器上有ubuntu操作系统,有4个核心。另外,我有一个名为python.py的python脚本,它具有不同的功能,如def1,def2和def 3。 我想在核心1上运行def1,其余在核心2到4上运行。 我知道我可以使用:

       #taskset -c 1 python.py 

这个问题使得整个脚本在其中的每个函数的一个核心上运行。但是,我想在特定的核心上运行特定的功能,例如:

       def add(a,b):
           return a+b

       def sub(s, t):
           return s-t

       def mult(y,x):
           return y*x

      add(3,4)  # run this function on core 0
      sub(3,4)  # run this function on core 1
      mult(2,3)  # I don't core run on core 2 or 3

我的问题是:这可能吗?

1 个答案:

答案 0 :(得分:1)

是的,您可以在不同的进程中运行每个功能,以便利用多个内核。这是一个例子:

from multiprocessing import Process

def add(a,b):
    return a+b

def sub(s, t):
    return s-t

def mult(y,x):
    return y*x

if __name__ == "__main__":
    # construct a different process for each function
    processes = [Process(target=add, args=(3,4)),
                 Process(target=sub, args=(3,4)),
                 Process(target=mult, args=(2,3))]

    # kick them off 
    for process in processes:
        process.start()

    # now wait for them to finish
    for process in processes:
        process.join()

无需强制操作系统在特定核心上运行特定进程。如果CPU上有多个内核,则操作系统将安排跨这些内核的进程。您不太可能需要在此处执行任何类型的CPU pinning

以上示例太简单,无法看到您的多个核心参与其中。相反,您可以尝试这个示例,它是上述的简单CPU绑定问题变体 - 即它只是一个需要更多计算的版本。

from multiprocessing import Process


def add(a, b):
    total = 0
    for a1, b1 in zip(a, b):
        total = a1 + b1
    return total


def sub(s, t):
    total = 0
    for a1, b1 in zip(s, t):
        total = a1 - b1
    return total


def mult(y, x):
    total = 0
    for a1, b1 in zip(y, x):
        total = a1 * b1
    return total


if __name__ == "__main__":
    # construct a different process for each function
    max_size = 1000000000
    processes = [Process(target=add, args=(range(1, max_size), range(1, max_size))),
                 Process(target=sub, args=(range(1, max_size), range(1, max_size))),
                 Process(target=mult, args=(range(1, max_size), range(1, max_size)))]

    # kick them off 
    for process in processes:
        process.start()

    # now wait for them to finish
    for process in processes:
        process.join()

如果您查看top输出(并按1查看内核),您应该看到类似这样的内容,其中三个内核的使用率为100%(或接近它)。这不需要做任何CPU固定。在操作系统中更容易信任并完成并行操作。

enter image description here