几点概念:
线程(thread):操作系统能调用的最小单位,是指令集合。
进程(process):进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。一个进程包括一个或多个线程。Python中一个py程序就是一个进程。
Python的GIL:GIL(全局解释器锁)只出现在Python的Cpython解释器中,其他解释器没有这种现象。出现原因是Python创始人为了管理线程对公共资源(变量等)的调用。因而限制了:单位时间内只允许一个线程在Cpython解释器上执行。从而导致Python语言没有真正意义上的多线程。
I/O密集型:指的是py程序包含较多的阻塞状态(例如:文件的读写、socket中的等待接受消息等),可以用多线程(伪)解决。
计算密集型:指的是py程序中对cpu计算能力要求很强(例如:求阶乘、累加等),不能用多线程,反而因为多线程之间的转换浪费了很多时间。
几点思考:
1,、目前计算机cpu往往都是多核,Python由于有GIL每次只能有一个线程在调用,因而都是cpu的一个核在计算。怎么才能利用上cpu的多核来完成py文件的处理?
答:
如图所示:Python虽然没有多线程,但是有多进程。对于几个线程我们没必要全部写在一个进程中(py程序中),换言之就是讲几个线程分发到几个进程中,这样就实现了多进程操作从而利用了cpu多核计算的能力。但是这种方法并不完美!多线程在一个进程中是可以互相“通信交流”的,共享资源(变量等)。进程与进程之间则不能互相“通信交流”,导致原本有关联的线程之间无法实现资源的共享。因此还要弥补这些不足。
2、线程和进程谁的运行速度快?
答:这种问法是干扰型的问题,进程和线程根本无法比较谁快谁慢。概念都不一样。而且一个进程往往包含多个线程,所有线程执行完基本上进程也就执行完了。