进程、线程、多进程、多线程学习记录

如下皆为本人在书籍、网络博客、论坛、知乎上浏览记录+本身整理理解的内容,若是有不足之处,欢迎指出一块儿探讨

  1. 什么是程序:程序是存放在磁盘里的一些二进制文件集合。
  2. 计算机如何执行一个程序:操做系统进行系统调用,将存放在磁盘上的程序文件加载到内存中,而后执行程序。
  3. 什么是多任务:即操做系统同时运行着许多个任务(程序),例如一边开着音乐播放器听歌一边在IDE上码代码。
  4. 如何实现多任务:
    1) 在单核CPU中:操做系统将多个程序加载到缓存区队列中,按照队列顺序执行,每一个任务执行必定时间(0.01s)后切换到下一个任务,以此类推,反复交替。由于间隔时间很是短,因此在咱们看来,这就是在同时运行着多个程序。可是在任意时刻,CPU上只运行着一个程序。(并发)
     2) 在多核CPU中:操做系统将任务轮流调度到每一个核心上,那么在任意时刻,CPU上有多个程序在运行(并行)。
  5. 什么是进程:进程即正在进行中(运行中)的程序。在之前,进程是CPU执行的最小单元。
  6. 什么是线程:咱们在计算机上观看电影的时候,画面跟声音同步,其实这是由两个子进程来控制的,一个子进程控制视频播放,另外一个子进程负责音频播放,可能还有其余的子进程负责其余的管理控制工做。那么就能够说这些子进程是播放器进程下的线程。现在计算机CPU的最小执行单元是线程。
  7. 什么是多进程:多进程即为多任务在单核跟多核CPU表现为并发跟并行.
  8. 什么是多线程:一个程序至少执行一个任务,则一个程序内至少有一个线程,当一个进程拥有多个线程的时候。其执行方式跟多进程是同样的,由操做系统将多个线程分发给不一样的核心去处理。
  9. 什么是守护线程:不重要线程,进程退出时,不须要等待守护线程执行的完成,用deamoon标识。执行了join()的线程不是守护线程。

总的来讲实现多任务能够是多进程、多线程、多进程+多线程(复杂用的少)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核心处理。网络

暂时先写这么多,先慢慢消化这些知识再继续。多线程