python中的线程

本文介绍了Python中的线程及其优点,包括后台处理任务、提升用户体验、加快程序运行速度以及在等待任务中的应用。接着讨论了线程同步中的锁概念,特别是全局解释器锁(GIL),并展示了如何创建和使用锁。最后提到了死锁问题及其危害,并提醒开发者避免编写可能导致死锁的代码。

线程

线程是需要依赖于进程的,它有独立的资源,进程内有一个相对独立的,可调度的执行单元,是进程中的实际运作单位

线程的优点:
1.使用线程可以把占据长时间的程序中的任务放到后台去处理。
2.用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。
3.程序的运行速度可能加快。
4.在一些等待的任务实现上如用户输入,文件读写和网络收发数据等,线程就比较有用了。在这种情况下,我们可以释放一些珍贵的资源,如内存占用等。

创建线程:
导入threading,使用其中的Thread类

import threading
# target 函数  name 线程名  args 传参
t1 = threading.Thread(target=func, name='AA', args=(1,))
t.start()
t.join()

在使用多线程时,为了保证数据的正确性,避免存在数据不同步的问题,所以引入了锁的概念

GIL:全局解释器锁
运算率达到一定的时候就会自动释放
python底层只要用线程就会默认加锁GIL

创建一个锁对象:

import threading
lock = threading.Lock()

请求得到锁
lock.acquire()

释放锁
lock.release()

死锁:先有锁a,b,线程(进程)a,b
线程t1首先使用锁a 然后休眠,此时锁a被使用 未释放
线程t1休眠时,线程t2使用锁b 然后休眠,此时锁b被使用 未释放
线程t1休眠结束,继续运行,占用资源、申请锁b,同时锁b被线程t2使用,是阻塞状态 无法释放,而线程t1则一直占用资源等待锁b释放,线程t2占用锁b却因为资源被占用无法释放锁b
此时就是死锁状态,会造成应用的停止响应,程序不做任何事情
要避免造成死锁的情况

会造成死锁的代码:

from threading import Thread,Lock
import time

lockA = Lock()
lockB = Lock()

class Mythread1(Thread):
    def run(self):
        if lockA.acquire():
            print(self.name+'获取了A锁')
            time.sleep(0.1)
            if lockB.acquire():
                print(self.name+'获取了A锁之后又获取了B锁')
            lockA.release()

class Mythread2(Thread):
    def run(self):
        if lockB.acquire():
            print(self.name+'获取了B锁')
            time.sleep(0.1)
            if lockA.acquire():
                print(self.name+'获取了B锁之后又获取了A锁')
                lockA.release()
            lockB.release()

if __name__ == '__main__':
    t1 = Mythread1()
    t2 = Mythread2()

    t1.start()
    t2.start()
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值