当前位置:   article > 正文

如何简单区分Python多进程与多线程_arcpy多线程

arcpy多线程

前言

之前在做项目时遇到并发的问题,就想到了Python多线程与多进程,由于Arcpy的特殊性,好多rest框架不合适,有同学如果用到arcpy,同时用到python rest框架,还是不要用flask,前辈踩过的坑哈哈。扯远了,下面就说说多线程与多进程的区别。

区别

上面这张片子进行了一个简单概念性的描述,但是最让人眨眼的是右边的图哈哈,这是我当时为了描述的客观可懂专门找的图。

多进程就相当于大伙干活,然后一起吃饭,各自吃各自的餐,最后把活干完,菜香只能自己体会,各自沉浸在各自的快乐中,吃饱喝足,说不上饭有剩的。

多线程相当于大伙给老板打工,完了一起聚餐,一个小锅,大伙一起抢着吃,锅大了都吃的好,但是锅小了都吃不饱,你抢我的我抢你,他一筷子下去手太大你还要等着。

示例代码

多线程

  1. from multiprocessing.dummy import Pool as ThreadPool
  2. import multiprocessing, time
  3. def mainfunc(num):
  4. starttime = time.time()
  5. s = 1
  6. for i in range(1, num):
  7. s *= i
  8. endtime = time.time()
  9. return "耗时:{0}".format(endtime-starttime)
  10. if __name__ == '__main__':
  11. pool = ThreadPool(multiprocessing.cpu_count())
  12. listdata = [200000, 200000, 200000, 200000, 200000, 200000, 200000, 200000]
  13. result = pool.map(mainfunc, listdata)
  14. pool.close()
  15. pool.join()
  16. print(result)

多进程

  1. import multiprocessing, time
  2. def mainfunc(num):
  3. starttime = time.time()
  4. s = 1
  5. for i in range(1, num):
  6. s *= i
  7. endtime = time.time()
  8. return "耗时:{0}".format(endtime-starttime)
  9. if __name__ == '__main__':
  10. pool = multiprocessing.Pool(multiprocessing.cpu_count())
  11. listdata = [200000, 200000, 200000, 200000, 200000, 200000, 200000, 200000]
  12. result = pool.map(mainfunc, listdata)
  13. pool.close()
  14. pool.join()
  15. print(result)

阻塞与非阻塞(异步)

上面贴了详细的代码,而对于multiprocessing库来说,Pool类有下面几种方法,也就是阻塞和非阻塞。

1. map&map_async

map是阻塞的,它会阻塞进程直至结果返回,相反map_async则是异步的每个进程都是单独的,不会相互影响。

2. apply&apply_async

和map一样,apply是阻塞的,但是两个函数对应的参数是不一样的,详细可以去接口看看。

运行结果

1. 多进程

['耗时:16.133437156677246', '耗时:16.113436937332153', '耗时:16.093438148498535', '耗时:16.0244357585907', '耗时:16.160436868667603', '耗时:16.20243549346924', '耗时:16.192437171936035', '耗时:15.965435981750488']

 2. 多线程

['耗时:75.55738019943237', '耗时:80.21012735366821', '耗时:78.34934687614441', '耗时:69.6355893611908', '耗时:65.87498378753662', '耗时:74.0091381072998', '耗时:78.06873106956482', '耗时:79.26412773132324']

 可以看到多进程运行时会启动多个python,前面我的设置是根据本机的cpu数量去设置的。而多线程只有一个python进程,对比最后的耗时,显然多进程会快好多,进程直接不相互抢占资源,而多线程就不一样的,相互直接因为资源会大打出手。

到此结束,有不当的还希望大家批评指正!

源码仓库:Python代码集: python代码仓库

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/151579
推荐阅读
相关标签
  

闽ICP备14008679号