Python3之多线程

来源:互联网 发布:韩国人眼中的中国知乎 编辑:程序博客网 时间:2024/05/29 16:09

概念

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

线程与进程区别

线程:

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

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

进程:

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

守护线程与守护进程

守护进程代码演示

import timefrom multiprocessing import Processdef 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 timefrom threading import Threaddef 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 timefrom threading import Thread,Locknum = 100def 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权限,循环往复~

你们明白了吗?哈哈,我这都不知道自己写了些什么!!!仰天长啸~
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 鼻子短怎么办除了手术 狗得了狗瘟怎么办 泰迪感染细小怎么办 痔疮术后肛门痒怎么办 肛门脓肿流血了怎么办 检查肛门拉屎了怎么办 怀孕期间肛门湿疹怎么办 头晕检查说没事怎么办 慢性咽喉炎引起的咳嗽怎么办 咽炎引起的咳嗽怎么办? 补牙换药后疼痛怎么办 深度伤口换药疼痛怎么办 孕妇肛门有蛲虫怎么办 孕妇上火拉血怎么办 孕期内检出血怎么办 顺产肛门脱肛了怎么办 怀孕痔疮老脱出怎么办 顺产后浑身酸疼怎么办 爬山后肌肉酸疼怎么办 手上打针胳膊疼怎么办 狗 打针后疼痛怎么办 流产后浑身酸疼怎么办 屋子里潮湿有味怎么办 墙潮湿发霉有味怎么办 当兵体检没有过怎么办 航空面试有纹身怎么办 儿童眼睛外斜视怎么办 大疆imu异常怎么办 新生儿血液回流不好怎么办 灌肠温度高了怎么办 炎症引起的咳嗽怎么办 90岁老人肠梗阻怎么办 84岁老人肠梗阻怎么办 婴儿开塞露后大便肚子疼怎么办 孕早期用开塞露肚子疼怎么办 冰点脱毛后刺痛怎么办 医院建不上档怎么办 dnf输入变繁体怎么办 机械钟表不走了怎么办 火柴枪卡住了怎么办 dnf卖掉的东西怎么办