赞
踩
之前在做项目时遇到并发的问题,就想到了Python多线程与多进程,由于Arcpy的特殊性,好多rest框架不合适,有同学如果用到arcpy,同时用到python rest框架,还是不要用flask,前辈踩过的坑哈哈。扯远了,下面就说说多线程与多进程的区别。
上面这张片子进行了一个简单概念性的描述,但是最让人眨眼的是右边的图哈哈,这是我当时为了描述的客观可懂专门找的图。
多进程就相当于大伙干活,然后一起吃饭,各自吃各自的餐,最后把活干完,菜香只能自己体会,各自沉浸在各自的快乐中,吃饱喝足,说不上饭有剩的。
多线程相当于大伙给老板打工,完了一起聚餐,一个小锅,大伙一起抢着吃,锅大了都吃的好,但是锅小了都吃不饱,你抢我的我抢你,他一筷子下去手太大你还要等着。
- from multiprocessing.dummy import Pool as ThreadPool
- import multiprocessing, time
-
-
- def mainfunc(num):
- starttime = time.time()
- s = 1
- for i in range(1, num):
- s *= i
-
- endtime = time.time()
- return "耗时:{0}".format(endtime-starttime)
-
-
- if __name__ == '__main__':
- pool = ThreadPool(multiprocessing.cpu_count())
- listdata = [200000, 200000, 200000, 200000, 200000, 200000, 200000, 200000]
- result = pool.map(mainfunc, listdata)
- pool.close()
- pool.join()
- print(result)
- import multiprocessing, time
-
-
- def mainfunc(num):
- starttime = time.time()
- s = 1
- for i in range(1, num):
- s *= i
-
- endtime = time.time()
- return "耗时:{0}".format(endtime-starttime)
-
-
- if __name__ == '__main__':
- pool = multiprocessing.Pool(multiprocessing.cpu_count())
- listdata = [200000, 200000, 200000, 200000, 200000, 200000, 200000, 200000]
- result = pool.map(mainfunc, listdata)
- pool.close()
- pool.join()
- print(result)
上面贴了详细的代码,而对于multiprocessing库来说,Pool类有下面几种方法,也就是阻塞和非阻塞。
map是阻塞的,它会阻塞进程直至结果返回,相反map_async则是异步的每个进程都是单独的,不会相互影响。
和map一样,apply是阻塞的,但是两个函数对应的参数是不一样的,详细可以去接口看看。
['耗时:16.133437156677246', '耗时:16.113436937332153', '耗时:16.093438148498535', '耗时:16.0244357585907', '耗时:16.160436868667603', '耗时:16.20243549346924', '耗时:16.192437171936035', '耗时:15.965435981750488']
['耗时:75.55738019943237', '耗时:80.21012735366821', '耗时:78.34934687614441', '耗时:69.6355893611908', '耗时:65.87498378753662', '耗时:74.0091381072998', '耗时:78.06873106956482', '耗时:79.26412773132324']
可以看到多进程运行时会启动多个python,前面我的设置是根据本机的cpu数量去设置的。而多线程只有一个python进程,对比最后的耗时,显然多进程会快好多,进程直接不相互抢占资源,而多线程就不一样的,相互直接因为资源会大打出手。
到此结束,有不当的还希望大家批评指正!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。