Python3之多线程

概念

线程是CPU执行调度的最小单位,进程只是开辟内存空间,整合内存资源

线程与进程区别

线程:

线程可以共享进程内的资源

线程的创建比进程的创建内存要小

进程:

各个进程间的内存空间是相互隔离的,进程间的相互通信资源共享依赖IPC(interprocess communication)机制

守护线程与守护进程

守护进程代码演示

import time
from multiprocessing import Process


def deal_task():
    time.sleep(3)
    print('coping with the task')


def cope_task():
    time.sleep(5)
    print('task is done')


if __name__ == '__main__':
    p1 = Process(target=deal_task, )
    p2 = Process(target=cope_task, )
    p1.daemon = True
    p1.start()
    p2.start()
    print('主进程')

代码讲解

子进程p1调用daemon将子进程设置为守护进程,当主进程的代码运行完毕,主进程的所有功能运行完毕,这时守护进程会被灭掉,相当于主子死了,随从必须跟着就去了,但是主进程必须要等非守护进程全部运行完毕后,给非守护进程把资源回收掉之后才能结束

守护线程代码演示

import time
from threading import Thread


def deal_task():
    time.sleep(3)
    print('coping with the task')


def cope_task():
    time.sleep(5)
    print('task is done')


if __name__ == '__main__':
    t1 = Thread(target=deal_task, )
    t2 = Thread(target=cope_task, )
    t1.daemon = True
    t1.start()
    t2.start()
    print('主线程')

代码讲解

守护进程和守护进程有所不同,主线程其实是代表进程,主线程产生进程产生,主进程销毁代表进程销毁,基于这点认识:当t1被设置为守护线程时,主线程可能已经提前结束,但是在代码执行过程中的其他线程会陆续创建,这时主线程不能结束,因为所有的线程都是在执行同一个进程的任务,进程的任务没有执行完毕,进程先结束了这显然不符合常理,所以主线程要等其他线程都结束了主线程才能结束,这样主线程结束了代表进程结束,而主线程结束了,守护线程也就跟着结束了。

线程的GIL(全局解释器锁)

GIL只有从CPython中有,所以不是Python的特性

GIL作用

控制解释器的执行权限

保护系统级别的数据

GIL与互斥锁同在的情况下代码运行分析

代码演示

import time
from threading import Thread,Lock

num = 100


def deal_num():
    mutex.acquire()
    global num
    # print(num)
    # time.sleep(0.1)
    # num -= 1
    # print(num)
    ##############
    temp = num
    time.sleep(0.5)
    num = temp - 1
    ##############
    mutex.release()


if __name__ == '__main__':
    mutex = Lock()
    t_l = []
    for t in range(100):
        t = Thread(target=deal_num, )
        t_l.append(t)
        t.start()
    for t in t_l:
        t.join()
    print('主线程', num)

代码讲解

GIL被加在进程上,所以每次程序的执行都会产生很多线程,这些线程要获取GIL才能获取解释器执行权限,进行使代码继续执行。这样保证同一时刻只有一个线程在运行,当一个线程拿到GIL时,mutex锁就会被会拿到,那么代码会继续执行,直接遇到sleep(0.5),I/O操作GIL锁被释放,其它线程会争夺GIL锁权限,但是某进程争夺到GIL锁权限时,发现内部的mutex锁还没被释放,只好继续等着,这时GIL锁再次被释放,其余线程再次争夺GIL,直到mutex锁被释放,mutex锁会被争夺,直到一个线程抢到mutex权限,循环往复~

你们明白了吗?哈哈,我这都不知道自己写了些什么!!!仰天长啸~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值