python笔记05_多线程

实例

import time, threading  

/# 新线程执行的代码:  
def loop():  
    print('thread %s is running...' % threading.current_thread().name)  
    n = 0  
    while n < 5:  
        n = n + 1  
        print('thread %s >>> %s' % (threading.current_thread().name, n))  
        time.sleep(1)  
    print('thread %s ended.' % threading.current_thread().name)  
  
print('thread %s is running...' % threading.current_thread().name)  
t = threading.Thread(target=loop, name='LoopThread')  
t.start()  
t.join()  
print('thread %s ended.' % threading.current_thread().name)  

Lock
多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响,
多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改,因此,线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了。
代码

balance = 0  
lock = threading.Lock()  
  
def run_thread(n):  
    for i in range(100000):  
        # 先要获取锁:  
        lock.acquire()  
        try:  
            # 放心地改吧:  
            change_it(n)  
        finally:  
            # 改完了一定要释放锁:  
            lock.release()  

当多个线程同时执行lock.acquire()时,只有一个线程能成功地获取锁,然后继续执行代码,其他线程就继续等待直到获得锁为止。
获得锁的线程用完后一定要释放锁,否则那些苦苦等待锁的线程将永远等待下去,成为死线程。所以我们用try...finally来确保锁一定会

GIL锁
Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值