python多处理和核心数

时间:2016-09-30 02:39:03

标签: python parallel-processing multiprocessing

我有一台mac,它有2个物理内核和4个逻辑内核。我想弄清楚python多处理。 据我所知,处理过程中的每个进程都使用计算机中的一个核心,所以我相信python脚本中的进程数不能超过计算机核心的数量。它是否正确 ?

但是如果我执行以下代码(它有8个函数),它会与具有4个函数的版本同时运行。

from multiprocessing import Process
import time 
def func1():
  for i in range(0,500):
    print "11111"
    time.sleep(0.1)


def func2():
  for i in range(500,1000):
    print "22222"
    time.sleep(0.1)

def func3():
  for i in range(1000,1500):
    print "33333"
    time.sleep(0.1)


def func4():
   for i in range(1500,2000):
    print "444444"
    time.sleep(0.1)

def func5():
   for i in range(2000,2500):
    print "555555"
    time.sleep(0.1)


def func6():
   for i in range(2500,3000):
    print "666666666"
    time.sleep(0.1)


def func7():
  for i in range(3500,4000):
    print "7777777777"
    time.sleep(0.1)

def func8():
  for i in range(4500,5000):
    print "8888888888 "
    time.sleep(0.1)

if __name__=='__main__':
  start_time = time.time()
  p1 = Process(target = func1)
  p1.start()
  p2 = Process(target = func2)
  p2.start()
  p3 = Process(target = func3)
  p3.start()
  p4 = Process(target = func4)
  p4.start()
  p5 = Process(target = func5)
  p5.start()
  p6 = Process(target = func6)
  p6.start()
  p7 = Process(target = func7)
  p7.start()
  p8 = Process(target = func8)
  p8.start()
  p1.join()
  p2.join()
  p3.join()
  p4.join()
  p5.join()
  p6.join()
  p7.join()
  p8.join()
  print "done"
  print("--- %s seconds ---" % (time.time() - start_time))

如果我使用4个函数或8个函数运行此代码,则执行时间相同,但核心数为4,因此我认为8个函数版本应该花费更长时间,但事实并非如此。我在这里遗失了什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以根据需要从Python脚本启动任意数量的进程,操作系统调度程序将安排它们在CPU内核上运行。如果这些进程受CPU限制,那么通过启动比核心更多的进程,您将无法获得更好的性能。但是在你的例子中,这些进程大部分时间都处于休眠状态,因此他们没有竞争核心,这就是为什么8个进程可以在4个进程中同时运行的原因。