一、线程的基本概念:
线程被称为轻量级进程。
计算机的执行单位以线程为单位。计算机的最小可执行是线程。
进程是资源分配的基本单位。线程是可执行的基本单位,是可被调度的基本单位。
线程不可以自己独立拥有资源。线程的执行必须依赖所属进程中的资源。
进程中必须至少有一个线程。
由于GIL(全局解释锁,只在Cpython中有),导致线程没有真正的并行。
线程分为用户级线程和内核级线程。
二、进程由 代码段、数据段、PCB(进程控制块)组成
线程由 代码块、数据块、TCB(线程控制块)组成
三、线程和进程的比较
thread -- 线程
导入线程模块的两种方法:
import threading
from threading import Thread
(1) cpu 切换进程比切换线程 慢很多。在python中,如果IO操作过多的话,使用多线程最好了。
(2) 在同一进程内,所有线程共享这个进程的pid,也就是说所有的线程共享所属进程的资源和内存。
(3) 在同一个进程内,所有线程共享该进程中的全局变量
(4) 因为有GIL锁的存在,在Cpython中,没有真正的线程并行。但是有多进程并行
当任务是计算密集的情况下使用多进程。
(5) 守护线程和守护进程的区别
守护进程:要么自己正常结束,要么等主进程的代码结束。
守护线程:要么自己正常结束,要么要等主进程的进程结束。
四、线程的使用方法。
(1)锁机制
递归锁 Rlock() 可以有无数的锁,但是这些锁有一把万能钥匙。
from threading import Thread, RLock def fn(r_tot, r_pap): r_tot.acquire() print('我在厕所') r_pap.acquire() print('我还有纸') r_tot.release() r_pap.release() def fn1(r_pap, r_tot): r_pap.acquire() print('wo也有纸') r_tot.acquire() print('我想上厕所') r_pap.release() r_tot.release() r_tot = r_pap = RLock() t1 = Thread(target=fn, args=(r_tot, r_pap)) t2 = Thread(target=fn1, args=(r_pap, r_tot)) t1.start() t2.start()
互斥锁 Lock() 一把锁配一把钥匙
GIL:全局解释锁 锁的是线程,同一时间只允许一个线程访问cpu
(2)信号量
from threading import Semaphore
from threading import Thread, Semaphore import time def fn(s, i, color): s.acquire() print('%s%s个小浣熊出生了 33[0m' % (color, i)) time.sleep(1) s.release() def fn1(s, i, color): s.acquire() print('%s%s个大灰狼来吃小浣熊了 33[0m' % (color, i)) s.release() s = Semaphore(5) for i in range(10): t1 = Thread(target=fn, args=(s, (i + 1), '