python多线程

本文介绍了Python中如何使用多线程进行并发编程,包括创建线程、使用互斥锁解决资源竞争问题,并讨论了全局解释器锁(GIL)对多线程的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值