python中的线程

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

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

线程

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

线程的优点:
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()
### Python线程与进程的区别 在Python中,线程和进程都是用于实现并发编程的重要机制,但两者之间存在显著差异。 #### 线程的特点 线程是操作系统能够进行运算调度的最小单位。多个线程可以在同一个进程中共享内存空间和其他资源,这使得线程间通信变得简单快捷[^1]。然而,由于全局解释器锁(GIL)的存在,在CPython实现下,即使启动了多线程,某些情况下也无法真正并行执行CPU密集型任务[^5]。 #### 进程的特点 相比之下,每个进程拥有独立的地址空间,这意味着不同进程之间的数据隔离较好,安全性更高。但是这也带来了更高的开销——创建新进程的成本远大于创建新线程,并且跨进程的数据交换相对复杂一些[^3]。 ### 使用场景分析 对于I/O密集型的应用来说,比如网络爬虫或文件处理工具,使用多线程往往能获得较好的效果;而对于计算密集型的任务,则更适合采用多进程方案以充分利用多核处理器的能力[^2]。 ### 实现示例 以下是简单的多线程和多进程的例子: #### 多线程实例 ```python import threading def print_numbers(): for i in range(5): print(f'Number {i}') thread = threading.Thread(target=print_numbers) thread.start() thread.join() # 主线程等待子线程完成后再继续往下走 ``` #### 多进程实例 ```python from multiprocessing import Process def print_letters(): for letter in 'ABCDE': print(letter) process = Process(target=print_letters) process.start() process.join() # 父进程等待子进程结束之后再继续运行下面的代码 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值