Python 多线程与多处理与顺序执行

标签 python multithreading python-2.7 multiprocessing

我有以下代码:

import time
from threading import Thread
from multiprocessing import Process 

def fun1():

 for _ in xrange(10000000):
        print 'in fun1'
        pass

def fun2():

 for _ in xrange(10000000):
        print 'in fun2'
        pass

def fun3():

 for _ in xrange(10000000):
        print 'in fun3'
        pass

def fun4():

 for _ in xrange(10000000):
        print 'in fun4'
        pass

if __name__ == '__main__':

  #t1 = Thread(target=fun1, args=())
  t1 = Process(target=fun1, args=())
  #t2 = Thread(target=fun2, args=())
  t2 = Process(target=fun2, args=())
  #t3 = Thread(target=fun3, args=())
  t3 = Process(target=fun3, args=())
  #t4 = Thread(target=fun4, args=())
  t4 = Process(target=fun4, args=())
  t1.start()
  t2.start() 
  t3.start() 
  t4.start()
  start = time.clock()
  t1.join()
  t2.join()
  t3.join()
  t4.join()
  end = time.clock()
  print("Time Taken = ",end-start)

  '''
  start = time.clock()
  fun1()
  fun2()
  fun3()
  fun4()
  end = time.clock()
  print("Time Taken = ",end-start)
  '''

我用三种方式运行上面的程序:

  • First Sequential Execution ALONE(查看注释代码,注释上面的代码)
  • 单独执行第二个多线程
  • 单独执行第三个多处理

end_time-start时间的观测值如下:

总运行时间

  • ('Time Taken = ', 342.5981313667716) --- 线程执行
  • 的运行时间
  • ('Time Taken = ', 232.94691744899296) --- 顺序执行
  • 的运行时间
  • ('Time Taken = ', 307.91093406618216) --- 多处理执行
  • 的运行时间

问题:

我看到顺序执行花费的时间最少,而多线程花费的时间最多。为什么?我无法理解,也对结果感到惊讶。请澄清。

由于这是一个 CPU 密集型任务并且获得了 GIL,所以我的理解是 多处理将花费最少的时间,而线程执行将花费最多的时间。请验证我的理解。

最佳答案

你使用 time.clock,它给你 CPU 时间而不是实时:你不能在你的情况下使用它,因为它给你执行时间(你使用了多长时间CPU 来运行你的代码,对于每种情况几乎都是相同的时间)

使用 time.time() 而不是 time.clock 运行您的代码让我在计算机上获得了这些时间:

Process : ('Time Taken = ', 5.226783990859985)
seq : ('Time Taken = ', 6.3122560000000005)
Thread :  ('Time Taken = ', 17.10062599182129)

这里给出的任务(打印)是如此之快,以至于使用多处理的加速几乎被开销所平衡。

对于 Threading,由于 GIL,您只能运行一个线程,因此您最终会按顺序运行所有函数,但是您有线程的开销(每隔几次迭代更改线程可能会增加成本每次几毫秒)。所以你最终得到的东西要慢得多。

线程 在您有等待时间时很有用,因此您可以在两者之间运行任务。

Multiprocessing 对于计算量大的任务很有用,如果可能完全独立(无共享变量)。如果您需要共享变量,那么您必须面对 GIL,它会稍微复杂一点(但大多数情况下并非不可能)。

编辑:实际上,像您一样使用 time.clock 可以让您了解使用 ThreadingMultiprocessing 的开销有多少。

关于Python 多线程与多处理与顺序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39159438/

相关文章:

c++ - ActiveMQ线程安全吗?

java - 永远不会结束的话题

python - 如何在正则表达式中不匹配特定的电子邮件地址

python - Pandas :保存数据框以打开工作簿

python - 我如何通过python中的ssh隧道连接到服务器

python2.7 : matplotlib in jupyter notebook can't use qt

Python 在启动应用程序后退出

python - 如何开始在 Linux 主机上使用 python

java - future 取消不适用于多线程的 executorService

ios - 使用 NAPALM 遍历开关列表