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

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

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

总的来说实现多任务可以是多进程、多线程、多进程+多线程(复杂用的少)

进程与线程的区别:
从性质上来说:进程是计算机资源分配的基本单位,而线程则是CPU执行跟调度的基本单位,也是进程下的一个执行流,线程包含于进程。
从资源分配方面来说:进程拥有自己的独立地址空间,而线程作为进程下下的执行流共享进程的所有资源。
从切换成本来说:线程间切换成本低于进程
从通信难度来说:线程间通信比进程更简单
从健壮性来说:进程更加健壮,大多数进程间是独立的,一个进程的异常不会影响到其他的进程,而线程由于同属于一个进程,所以当一个线程发生异常后,整个进程都将不能继续进行。


子进程的实现(子进程不等同于线程?)
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核心处理。

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

猜你喜欢

转载自blog.csdn.net/Noob_coder_JZ/article/details/81359550