注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

蜻蜓点水 举重若轻

君子终日乾乾

 
 
 

日志

 
 

这是幻觉来的 。。。  

2010-07-21 10:29:57|  分类: Python |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
#!/usr/bin/env python
from thread import start_new_thread
def loop():
    while 1:
        pass
start_new_thread(loop, ())
start_new_thread(loop, ())
start_new_thread(loop, ())
loop()

关于 cpython 线程能否充分用到 cpu 多核,相信很多人都做过这个测试。每个线程都起一个空循环,如果能把 cpu 多核全部占满,则说明已经用到多核。

这个实验很久以前做过,结果当然是只有一个 cpu 核心 100% 满载,其他核心无负荷。关于这个问题,似乎早有定论,由于 GIL 的存在 python 多线程是无法充分使用多核的。

最近又就此做了下测试,忽然发现机器上的双核都用完了。而且在 cpython2.5.5、cpython2.6.4、cpython2.7、unladen swallow q3、pypy-jit1.3 上普遍如此。



AMD Athlon(tm) Dual Core Processor 5000B
#37-Ubuntu SMP Fri Jun 11 08:03:28 UTC 2010

关于这件事,我在 python-cn 论坛上发了个贴。不多时,zoomq 说的洗具发生了,在其他机器上也得到了相同的结果。




由 Zoom Quiet 提交
Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz
ubuntu 10.04 i686


由 GKermit 提交
i5 430M 2.26Hz, 1066 MHz FSB
ubuntu 10.04

这意味着至少在一些情况下 python 线程是可以使用多核的。

最新测试结果表明,这是幻觉来的 。。。

#!/usr/bin/env python
from time import time, sleep
from thread import start_new_thread
def ipp():
    i = 0
    while 1:
        if time() > t:
            print '[i]'%i
            break
        i += 1
t = time() + 5
start_new_thread(ipp, ())
start_new_thread(ipp, ())
start_new_thread(ipp, ())
start_new_thread(ipp, ())
ipp()
sleep(1)

在这种简单情况下,只能用到单核。并且单线程完成的循环数要高于多线程的总循环数,性能更好。

幻觉,一切都是幻觉。空循环只是个特例,大家洗洗睡吧 ……

  评论这张
 
阅读(3320)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017