一个CPU在同一个时间片,只能执行一个任务。
并行 : 多个CPU同时执行多个任务(CPU >= 任务数)
C10K
Intel 超线程 : 一个CPU核心,可以有两个任务执行单元
AMD
并发 : 单个CPU需要执行多个任务 (CPU < 任务数)
多进程 :multiprocessing 并行
每个进程都有自己独立的内存空间,不同进程不能共享内存空间,所以多进程的任务开销太大。
多线程 :threading、并发
多个线程共享同一个进程的内存空间,数据通信、信号、切换开销极小。 抢占式获取系统资源
互斥锁:让多个线程安全有序的访问内存空间的机制。
GIL 全局解释器锁:在一个解释器环境下,一次只能运行一个线程。
从根本上杜绝了多个线程访问内存空间的安全问题。
GIL 在IO阻塞的时候,会自动释放,尝试让其他线程工作。
多协程 : 并发
协程 本质是 函数/方法,由程序员调度。
gevent
gevent.monkey.patch_all()
将Python底层的网络库(socket、select)打个补丁,让他们在处理网络IO的时候,按异步的方式执行。
同步、异步 : 执行方式
阻塞、非阻塞 : 执行状态
1 迭代list的每个元素,并将元素做为参数传递给func执行,最后将所有的返回值统一保存在 resutl_list
result_list = pool.map(func, list, list)
2 迭代list的每个元素,并将元素做为参数传递给func执行,最后将所有的返回值的列表一起传递给callback处理
pool.map_async(func, list, callback)
3 将args做为参数传递给func执行(apply是同步阻塞方式执行,不是异步)
result = pool.apply(func, args)
4 将args做为参数传递给func执行,并将返回值传递给callback执行
pool.apply_async(func, args, callback)
协程池不需要close
pool.close()
pool.join()