多线程,是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(chip-level multithreading)或同时多线程(simultaneous multithreading)处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(thread),利用它编程的概念就叫作“多线程处理(multithreading)”。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程(***译作“执行绪”),进而提升整体处理性能。
写python多线程的时候,用了几个测试的程序,分别是递归方法求斐波那契数的值。分别采用单线程一个一个执行的方法和采用多线程调用的方法。观察所用的时间基本上差不多的。
然后我在每个函数内部加入sleep()函数以后,分别让它们睡零点几秒钟。这样一来,明显多线程执行所用的时间要少很多。
这时我突然好奇,想看看在用python多线程执行的时候,是否可以利用cpu多个核心呢?我的笔记本是i3处理器,双核,4线程(我至今不知道这里所指的4线程具体是什么意思,之前和老师交流过,猜测可能是在硬件上做了像我们软件执行的时候的躲进程这样类似的东西,但是不确定),反正在我的系统下的系统监视器里面可以看到有4个核的利用率频线。我就观察这种曲线的变化方式:当我每一个都是单线程地运行的时候。显示的画面中有一个cpu爆满;但是在多线程运行的时候,是每一个利用一些。
下面是系统监视器显示情况:
这是运行时间对比:
显然多线程运行的时候时间反而长了很多,虽然有上下文切换的时间损耗,但是若是能够利用多核的话也不至于那么慢,另外由系统监视器可以看出多线程的时候也没有把各个核利用率达到很高的一个水平。所以当时推断python的多线程并没有很多的利用多核cpu,其实之前也有听说过python对于多核cpu支持是个缺陷,现在是有真的体会,但是我只是凭自己的小实验,也不能有很打保证啊,也只是猜测,后来翻了一下《python参考手册》发现有这么一句话,看来是真的证实了我自己的猜想啊!!!
尽管是很低级的问题,但是对于初学的我来说,还是有很大的喜悦的。
下面是实验的代码:
fab.py:
# -*- coding: utf-8 -*-
from mythread import mythread
from time import ctime
from time import sleep
import sys
def fib(x):
# sleep(0.005)
if x《2:return 1
return (fib(x-2) + fib(x-1))
def fac(x):
# sleep(0.05)
if x《2:return 1
return (fac(x-2)+fac(x-1))
def sum(x):
# sleep(0.05)
if x《2:return 1
return (sum(x-2)+sum(x-1))
funcs = [fib,fac,sum]
n = 35
def main():
nfuncs = range(len(funcs))
sys.stdout.write(‘***single thread\n’)
for i in nfuncs:
sys.stdout.write(‘starting %s at: %s\n’ %(funcs[i].__name__,ctime()))
print funcs[i](n)
sys.stdout.write(“%s finished at: %s\n”% (funcs[i].__name__,ctime()))
sys.stdout.write(‘\n***multiple threads\n’)
threads = []
for i in nfuncs:
t = mythread(funcs[i],(n,),funcs[i].__name__)
threads.append(t)
for i in nfuncs:
threads[i].start()
for i in nfuncs:
threads[i].join()
print threads[i].getresult()
sys.stdout.write(‘all done\n’)
if __name__ == ‘__main__’:
main()
mythread.py:
import threading
from time import ctime
import sys
class mythread(threading.thread):
def __init__(self,func,args,name=‘’):
threading.thread.__init__(self)
self.name = name
self.func = func
self.args = args
def getresult(self):
return self.res
def run(self):
sys.stdout.write(“starting %s at: %s\n” % (self.name,ctime()))
self.res = apply(self.func,self.args)
sys.stdout.write(“%s finished at: %s\n” % (self.name,ctime()))
小米开拓海外市场 紫米将在印度市场推出4G功能机
高光谱遥感识别地下储存天然气微泄漏点
谷歌利用现有混合云协助开发人员建立和监控谷歌云上各种云端服务
简单的焦耳小偷电路介绍
移动机器人上半年整体销量增长率130%,同期在中国的销售额增长达230%
关于python不能真正多线程问题解析
手机内置NFC硬件模块可实现的三种功能
定点DSP C55x音频专用处理器嵌入式教学
云之家助力科沃斯打造E-Link
电子书的特点
实例分析,如何识读照明系统图
LabVIEW 2012提高量测/控制系统的稳定性
眼球追踪技术你知道吗?特斯拉Autopilot自动驾驶系统曾有意加入
便携式生物毒性测定仪的特点是什么
C语言strcpy函数的使用
EXAR推出基于I2C和SPI的GPIO扩展芯片
怎样在浏览器中制作桌面应用
存储密度跃升几十倍,自旋电容器还能减少热量损失
奥拓电子募集资金总额不超过2.90亿元 将投入建设多个项目
电磁离合器的检测及常见故障解决