GIL锁原理示意图
多线程与IO
[x] io是分为网络io和磁盘io,一般情况下,io有发送数据(output)和返回数据(input)两个过程。比如以浏览器为主体,浏览器发送请求给服务器(output),服务器再将请求结果返回给浏览器(input)。python在io阻塞的情况下,会释放GIL(global interpreter lock)锁,其他线程会在当前线程等待返回值(阻塞)的情况下继续执行发送请求(output),第三个线程又会在第二个线程等待返回值(阻塞)的情况下发送请求(output),即在同一时间片段,会有一个线程在等待数据,也会有一个线程在发数据。这就减少了io传输的时间。
[x] 正是有了GIL锁的特性,造成了Python的多线程适合IO密集型任务,相比异步asyncio复杂的语法和只适合函数的原因,因此多线程的实用性比asyncio高,因此这里暂时不介绍asyncio。