什么是“进程、线程、协程”?( 四 )

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

什么是“进程、线程、协程”?

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

文章插图
 
测试
  • 执行代码
 import multiprocessingimport threadingimport time
def 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.start
for p in process: p.join
end_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 asyncio
async def coroutine: await asyncio.sleep(1) ## 模拟IO操作
if __name__ == "__main__": start_time = time.time
loop = 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密集:多进程+协程

【什么是“进程、线程、协程”?】


推荐阅读