- 线程Thread0首先执行,线程Thread1等待(GIL的存在)
- Thread0收到I/O请求,将请求转发给DMA,DMA执行请求
- Thread1占用CPU资源,继续执行
- CPU收到DMA的中断请求,切换到Thread0继续执行

文章插图
与进程的执行模式相似,弥补了GIL带来的不足,又由于线程的开销远远小于进程的开销,因此,在IO密集型场景中,多线程的性能更高实践是检验真理的唯一标准,下面将针对I/O密集型场景进行测试 。

文章插图
测试
- 执行代码
import multiprocessingimport threadingimport timedef count(num): time.sleep(1) ## 模拟IO操作 print("Process {0} End".format(num))if __name__ == '__main__': start_time = time.time process = list for i in range(5): p = multiprocessing.Process(target=count, args=(i,)) # p = threading.Thread(target=count, args=(i,)) process.append(p)for p in process: p.startfor p in process: p.joinend_time = time.time print("Total time:{0}".format(end_time - start_time))- 结果
## 多进程Process 0 EndProcess 3 EndProcess 4 EndProcess 2 EndProcess 1 EndTotal time:1.383193016052246## 多线程Process 0 EndProcess 4 EndProcess 3 EndProcess 1 EndProcess 2 EndTotal time:1.003425121307373- 多线程的执行效性能高于多进程
是不是认为这就结束了?远还没有呢 。针对I/O密集型的程序,协程的执行效率更高,因为它是程序自身所控制的,这样将节省线程创建和切换所带来的开销 。以Python中asyncio应用为依赖,使用async/await语法进行协程的创建和使用 。
- 程序代码
import timeimport asyncioasync def coroutine: await asyncio.sleep(1) ## 模拟IO操作if __name__ == "__main__": start_time = time.timeloop = asyncio.get_event_loop tasks = for i in range(5): task = loop.create_task(coroutine) tasks.append(task)loop.run_until_complete(asyncio.wait(tasks)) loop.close end_time = time.time print("total time:", end_time - start_time)- 结果
total time: 1.001854419708252- 协程的执行效性能高于多线程

文章插图
总结本文从操作系统原理出发结合代码实践讲解了进程,线程和协程以及他们之间的关系 。并且,总结和整理了Python实践中针对不同的场景如何选择对应的方案,如下:
- CPU密集型:多进程
- IO密集型:多线程(协程维护成本较高,而且在读写文件方面效率没有显著提升)
- CPU密集和IO密集:多进程+协程
【什么是“进程、线程、协程”?】
推荐阅读
- 梦幻西游5开最好的组合是什么?
- 世界十大猛犬排名是怎样的?
- 智慧团建怎么转团关系?
- 专升本条件要求是什么?
- 可能存在生命的星系 星球本身是生命体
- 太阳将在约50亿年后成为什么 太阳将在约50亿年后成为哪一种星体
- 人有阴阳眼是真的吗? 阴阳眼能看到什么
- 金星为什么被称为金星 金星有生命信号
- 喝老寿眉的好处有哪些,有什么适合年轻人喝的茶
- 菊普什么人不能喝,紫罗兰花茶什么人不能喝
