python多线程
2015-12-18 15:28
615 查看
python的多线程写起来还算是容易的,声明一个类,继承threading.Thread并实现run函数就好了
使用join函数,可确保两个线程都结束后再执行print 'ok‘
线程之间会为了争夺同一个资源而产生竞争,可以使用lock来实现互斥,先看一个没有互斥的例子
最终的打印结果会小于4000,这是因为执行一次加1操作并不是我们所以为的那样简单,真实的过程是,从内存中读取counter的值写入到寄存器,在寄存器里执行加1,写会内存。由于是多线程,所以可能第一个线程刚刚把值写入到寄存器,第二个线程就开始执行加1操作了,也从内存读取数值写入寄存器,这样一来,原本应该增加2,最后却只增加了1,最后给出加锁的示例
需要注意的是,由于python的全局解释器锁的存在,使得python的多线程不能有效的利用多核,同一个时间内,只有一个线程获得了全局解释器锁,因此,对于CPU密集型的操作,就不要用多线程了,因为线程间的上下文切换反而会浪费性能,如果是I/0密集型的,例如网络爬虫,用多线程还是可以的,因为有相当一部分时间是在等待网络返回来的数据。大家普遍认为多线程很鸡肋,除了全局解释器锁这个因素外,python还提供了同样好用的多进程multiprocessing
#coding = utf-8 ''' Created on 2015-10-20 @author: kwsy2015 ''' import threading import time class ThreadWorker(threading.Thread): def __init__(self,workcount,sleepTime): self.workcount = workcount threading.Thread.__init__(self) self.sleepTime = sleepTime def run(self): for i in range(self.workcount): print 'thread %s finish %d' % (self.name,i) time.sleep(self.sleepTime) if __name__=='__main__': tw = ThreadWorker(10,0.5) tw.start() tw2 = ThreadWorker(8,0.8) tw2.start() tw.join() tw2.join() print 'ok'
使用join函数,可确保两个线程都结束后再执行print 'ok‘
线程之间会为了争夺同一个资源而产生竞争,可以使用lock来实现互斥,先看一个没有互斥的例子
#coding = utf-8 ''' Created on 2015-10-20 @author: kwsy2015 ''' import threading import time class ThreadWorker(threading.Thread): def __init__(self,workcount): self.workcount = workcount threading.Thread.__init__(self) def run(self): global counter for i in range(self.workcount): counter +=1 if __name__=='__main__': counter = 0 tw = ThreadWorker(2000) tw.start() tw2 = ThreadWorker(2000) tw2.start() tw.join() tw2.join() print counter
最终的打印结果会小于4000,这是因为执行一次加1操作并不是我们所以为的那样简单,真实的过程是,从内存中读取counter的值写入到寄存器,在寄存器里执行加1,写会内存。由于是多线程,所以可能第一个线程刚刚把值写入到寄存器,第二个线程就开始执行加1操作了,也从内存读取数值写入寄存器,这样一来,原本应该增加2,最后却只增加了1,最后给出加锁的示例
#coding = utf-8 ''' Created on 2015-10-20 @author: kwsy2015 ''' import threading import time lock = threading.RLock() class ThreadWorker(threading.Thread): def __init__(self,workcount): self.workcount = workcount threading.Thread.__init__(self) def run(self): global counter for i in range(self.workcount): with lock: counter +=1 if __name__=='__main__': counter = 0 tw = ThreadWorker(2000) tw.start() tw2 = ThreadWorker(2000) tw2.start() tw.join() tw2.join() print counter
需要注意的是,由于python的全局解释器锁的存在,使得python的多线程不能有效的利用多核,同一个时间内,只有一个线程获得了全局解释器锁,因此,对于CPU密集型的操作,就不要用多线程了,因为线程间的上下文切换反而会浪费性能,如果是I/0密集型的,例如网络爬虫,用多线程还是可以的,因为有相当一部分时间是在等待网络返回来的数据。大家普遍认为多线程很鸡肋,除了全局解释器锁这个因素外,python还提供了同样好用的多进程multiprocessing
相关文章推荐
- python基础类型
- ROS_12.18_BaxterAPI_python
- python文件夹复制
- Python类的地址
- Learning Python(4)--错误处理
- [Python] 分布式新浪爬虫的实现
- 使用Python编写简单的端口扫描器的实例分享
- 使用python爬取豆瓣电影图片(-)
- 每天学点Python之布尔类型
- python怎么生成EXE(python3以上版本)
- python代码追踪
- python通过pyserial读写串口--2013-06-02
- Python元组
- python初学―-实现excel里面读数据进行排序
- Python(2.5)语言小结
- Python(2.5)语言小结
- Python Beginner
- python 控制台cmd运行出现乱码(原因之一)
- notepad++ 中配置 python一键运行
- Python面向对象