如下皆为本人在书籍、网络博客、论坛、知乎上浏览记录+本身整理理解的内容,若是有不足之处,欢迎指出一块儿探讨
总的来讲实现多任务能够是多进程、多线程、多进程+多线程(复杂用的少)python
进程与线程的区别:
从性质上来讲:进程是计算机资源分配的基本单位,而线程则是CPU执行跟调度的基本单位,也是进程下的一个执行流,线程包含于进程。
从资源分配方面来讲:进程拥有本身的独立地址空间,而线程做为进程下下的执行流共享进程的全部资源。
从切换成原本说:线程间切换成本低于进程
从通讯难度来讲:线程间通讯比进程更简单
从健壮性来讲:进程更加健壮,大多数进程间是独立的,一个进程的异常不会影响到其余的进程,而线程因为同属于一个进程,因此当一个线程发生异常后,整个进程都将不能继续进行。web
子进程的实现(子进程不等同于线程?)
1. 在每次run xx.py的时候其实就已经自动建立了一个进程,系统给咱们提供了一个方法来建立子进程,即os.fork()。咱们能够用os.getpid()方法来获取进程的id,若是返回为0,那么这个进程为子进程,若果不是,那么该进程为父进程。由于子进程老是返回0。若一个进程被肯定为子进程,那么咱们能够经过os.getppid()方法来获取该子进程的父进程。
3. python 里的 multiprocess模块里的Process类,经过实例化该类能够实现一个进程.
def func1(name):
print(“my name is ” + name)
p = Process(target=func1, args=(“jzhang”,))
p.start()
p.join()
start()函数用于启动进程
join()函数起到进程间同步的做用,他要求等全部进程都结束了才继续向下运行。
Process类的第一个参数为一个函数。后面的为收集参数,用元组传递。
4. 经过进程池Pool批量建立子进程
p = Pool(4) // 在进程池中建立4个子进程
for i in range(5):
p.apply_async(func1, args=(i,)) // 经过循环调用这4个子进程
p.close() // 关闭进程池,关闭后不能够再继续往进程池中添加子进程
p.join()
Pool默认大小为当前计算机的CPU核心数,若是为4核,那么它先一次直接运行4个子进程,其他的先不运行,等4个中的一个运行结束之后再顶替上,至关于并发+并行。缓存
线程的实现-threading模块
Thread:线程对象,能够实例化出一个线程。
Lock:锁,解决多线程访问同一资源产生的竞争问题。
Semaphore/BoundedSemaphore:信号量,标识着资源的可用与否。为线程间共享的资源提供了一个计数器,资源被调用则计数器减1,若资源被释放回来,则计数器加1,若没有可用资源时会被阻塞。
python因为锁的机制多线程适合I/0密集型应用,计算密集型则交给多进程分配给多个CPU核心处理。网络
暂时先写这么多,先慢慢消化这些知识再继续。多线程