如何让一个Python的脚本跑满多核的CPU

因为有了GIL,python的多线程并没有起到多核的作用。
这些线程都在单个核心上运行。
因此,想要发挥多核的作用,就需要使用多进程。
尽可能在每个CPU核心上分配给一个python进程。
因此,如果要运行多核CPU,就必须将多个进程和线程相互组合起来。

python的multiprocessing到底怎么用的问题

众所周知,由于Python(Cpython)的全局锁(GIL)问题,线程并行性不被理解。
Multiprocessing模块解决了GIL的问题,用多进程代替多线程实现并行,一定程度上缓解了这种情况。
然而,Multiprocess本身仍然存在一些性能瓶颈。
重要的一点是进程之间不能共享内存(线程之间可以共享内存)。
即进程间交换数据时对数据进行打包。
需要转运和包装。
在Python的上下文中:“picklefrommainprocesstothesubprocess;depicklefromsubprocesstoanobjectinmemory;pickleandreturntothemainprocess;depicklefrommainprocessandrereturntomemory”(有关详细信息,请参阅此问题下的评论)因此,当多个进程需要共享精细数据包之间的多个操作时。
与多个进程一样,多个功能需要共享。
这是一个单一的过程。
此外,当需要执行的程序不是计算密集型,而是IO密集型时。
如果程序复杂度不需要并行解决。
多个进程的读写增加将抵消计算速度的增益。
那么建立进程(池)的时间很可能比运行程序本身还要慢。
在multiprocessing.Pool(n)中选择n时,您可以计算当前CPU的核心数(multiprocessing.cpu_count())。
如果您选择的数字大于进程之间的切换效率会大大降低。
直观地理解线程和进程之间的关系。
参考这篇文章。
要快速、完整地了解python的全局锁定(GIL)问题,请参阅此博客。
为了理解多进程的用法,测试环境是4核MacbookAir。
如下:frommultiprocessingimportProcess,Manager,Pool1deff(l):2l.reverse()3return45defmain():6l1=[random.randrange(0,100000,1)foriinrange(0,100000)]7l2=[random.randrange(0,100000,1)),1)foriinrange(0,100000)]8l3=[随机.randrange(0,100000,1)foriinrange(0,100000)]9l4=[随机.randrange(0,100000,1)foriinrange(0,100000)]10l5=[随机.randrange(0,100000,1)foriinrange(0,100000)]11l6=[随机.randrange(0,100)000,1)foriinrange(0,100000)]12l7=[random.randrange(0,100000,1)foriinrange(0,100000)]13s=time.time()14forlin[l1,l2,l3,l4,l5,l6,l7]:15f(l)16print"%s秒"%(time.time()-s)17s=time.time()18map(f,[l1,l2,l3,l4,l5,l6,l7])19print"%s秒"%(time.time()-s)20p=Pool(4)21s=time.time()22p.map(f,[l1,l2,l3,l4,l5,l6,l7])23print"%sseconds"%(time.time()-s)24返回为l1,l2,l3,l4,l5,l6,l77是时候为列表单独测试f()了。
首先是循环的顺序操作。
然后是python中非常有用的map()函数,最后是多处理进程池multiprocessing.Pool.map()——进程池中建立了4个工作进程;那是,4个任务将被随机分配完成。
我在每次操作之前延迟并得到了这个结果:>>>main()0.00250101089478seconds0.000663995742798seconds0.907639980316seconds多进程出奇地慢。
与循环操作相比,Map()具有很好的效率提升。