您的位置:首页 > 编程语言 > Python开发

python多线程

2015-12-18 15:28 615 查看
python的多线程写起来还算是容易的,声明一个类,继承threading.Thread并实现run函数就好了

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: