控制python代码在不同的内核上运行
我的机器上有4个内核的ubuntu操作系统。另外,我还有一个名为python.py的python脚本,它具有不同的函数,如def1、def2和def3。 我想在Core1上运行def1,在Core2到4上运行其余的。 我知道我可以使用:控制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
#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。但我认为我应该有办法告诉操作系统在不同的内核上运行它们。因为有两个函数我不想让它们在同一个内核上运行。如果我让操作系统在这些核心上调度进程,我不能保证它们是否运行在同一个核心上。我想你已经部分回答了你自己的问题。您可以使用
子流程
模块并传递带有必要参数的任务集
。您必须重新组织代码,使每个函数都在自己的脚本中,并且可以使用结果。