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

社会

我有以下代码:

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)
  '''

我以三种方式运行了上述程序:

  • 第一次顺序执行(查看注释的代码并注释上面的代码)
  • 仅第二个多线程执行
  • 单独进行第三次多处理执行

对end_time-start时间的观察如下:

总运行时间

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

问题 :

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

由于这是一项占用大量CPU的任务并且需要GIL,因此我的理解是多处理将花费最少的时间,而线程执行将花费最多的时间。请验证我的理解。

联合市场

您使用time.clockwich会给您CPU时间,而不是实时的时间:您无法在这种情况下使用它,因为它会给您执行时间(您使用CPU多长时间运行代码,wich几乎是同一时间对于每种情况)

运行您的代码time.time()而不是time.clock给我这些时间在我的计算机上:

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

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

对于Threading,由于GIL的缘故,您只能运行一个线程,因此最终将依次运行所有函数,但是却产生了线程管理的开销(每几次迭代更改一次线程每次可能要花费几毫秒的时间)。因此,您最终得到的结果要慢得多。

Threading 如果您有等待时间,此功能很有用,因此您可以在两者之间运行任务。

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

编辑:实际上,time.clock像您一样使用确实为您提供了有关使用ThreadingMultiprocessing花费多少开销的信息

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python多处理与多线程结合

来自分类Dev

python中的多处理/多线程下载文件

来自分类Dev

Python多线程和多处理可加速循环

来自分类Dev

使用多处理或多线程来提高Python的抓取速度

来自分类Dev

在Python中将多线程转换为多处理

来自分类Dev

python中的多处理/多线程下载文件

来自分类Dev

如何实现请求的多线程或多处理

来自分类Dev

多线程/多处理加快抓取

来自分类Dev

BASH中的多处理/多线程

来自分类Dev

多线程是多处理的扩展吗?

来自分类Dev

守护进程行为多处理多线程

来自分类Dev

C 中的多线程与多处理

来自分类Dev

Python多处理/线程清理

来自分类Dev

Python多处理线程池

来自分类Dev

Python中具有多线程/多处理功能的矩阵求和

来自分类Dev

Python Google Sheets APIv4:同时进行多处理和多线程

来自分类Dev

如何使用多线程/多处理并行高效地运行python脚本?

来自分类Dev

在 Python 中进行多线程/多处理时如何避免重复结果?

来自分类Dev

Flask Web服务器的多处理与多线程

来自分类Dev

使用此脚本实现多线程(或多处理?)吗?

来自分类Dev

如何在Python网络机器人中有效地实现多线程/多处理?

来自分类Dev

python多处理/线程代码提前退出

来自分类Dev

Python多处理比单线程慢

来自分类Dev

C函数的混合线程与python的多处理

来自分类Dev

Python:串行,线程,多处理。最快的方法是?

来自分类Dev

Python多处理:了解线程/ CPU编号

来自分类Dev

Python-在多处理中使用线程

来自分类Dev

Python多处理比单线程慢

来自分类Dev

Python 多处理每个线程的多个进程