我的机器上有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
我的问题是:这可能吗?
答案 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固定。在操作系统中更容易信任并完成并行操作。