Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
控制python代码在不同的内核上运行_Python_Multithreading_Multiprocessing - Fatal编程技术网

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

控制python代码在不同的内核上运行,python,multithreading,multiprocessing,Python,Multithreading,Multiprocessing,我的机器上有4个内核的ubuntu操作系统。另外,我还有一个名为python.py的python脚本,它具有不同的函数,如def1、def2和def3。 我想在Core1上运行def1,在Core2到4上运行其余的。 我知道我可以使用: #taskset -c 1 python.py 这个问题使得整个脚本在一个内核上为其中的每个函数运行。但是,我希望在特定的核心上运行特定的功能,例如: def add(a,b): return a+b

我的机器上有4个内核的ubuntu操作系统。另外,我还有一个名为python.py的python脚本,它具有不同的函数,如def1、def2和def3。 我想在Core1上运行def1,在Core2到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

我的问题是:这可能吗

是的,您可以在不同的进程中运行每个函数,以利用多个内核。以下是一个例子:

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

上面的例子太简单了,无法看到多个核心参与进来。相反,您可以尝试这个例子,它是上面的一个简单的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固定。更容易信任操作系统来完成并行性


谢谢paul,但是如果我不告诉进程必须在哪个内核上运行,我如何确定它们在不同的内核上运行。您不需要告诉操作系统在不同的内核上运行它们。如果你有多个核心和多个进程,那么操作系统将使用这些核心。谢谢Paul。但我认为我应该有办法告诉操作系统在不同的内核上运行它们。因为有两个函数我不想让它们在同一个内核上运行。如果我让操作系统在这些核心上调度进程,我不能保证它们是否运行在同一个核心上。我想你已经部分回答了你自己的问题。您可以使用
子流程
模块并传递带有必要参数的
任务集
。您必须重新组织代码,使每个函数都在自己的脚本中,并且可以使用结果。