多线程
一、线程
在Python中,实现多任务也可以使用多线程。
多线程一般用于轻量级的多任务,多线程是CPU调度的基本单位。
在Python中,多进程可以使用多个CPU,多线程只能使用一个CPU核心。原因:CPython
源码实现了GIL(全局解释器锁)
GIL的实现原理:
- 设置GIL锁;
- 多个线程抢占CPU资源,线程1抢到了资源
- 线程在GIL内执行,运行情况有两种:
- 被动:由于CPU时间片轮转,让线程休眠,释放GIL锁;
- 自动:线程1主动休眠(中断)、让步(yielded)释放;
- 多个线程再抢占资源,比如线程2抢到资源;
- 循环这个过程。
多线程一般用于网络信息的传输、多文件的读写、数据库的IO等等属于轻量的多任务。
二、线程的使用
- 语法
import threading
threading.Thread(group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None)
- 代码
import threading
import time
def sing(n):
for _ in range(n):
print('sing...')
time.sleep(0.2)
def dance(n):
for _ in range(n):
print('dance...')
time.sleep(0.2)
if __name__ == '__main__':
t1 = threading.Thread(target=sing, args=(5,))
t2 = threading.Thread(target=dance, args=(5,))
t1.start()
t2.start()
三、线程执行带参数的任务
def demo_01(name, age):
print(name, age)
if __name__ == '__main__':
t1 = threading.Thread(target=demo_01, args=('zhangsan',), kwargs={
'age':18})
t1.start()
四、线程的执行顺序
线程的执行是无序的,由CPU来调度;
进程的执行是无序的,由操作系统来调度。
import threading
import time
def demo_01():
time.sleep