前言
本文将和大家一起探讨进程、线程、协程的监控方式,方便我们将这些“虚的东西”具体化,也方便讲解诸如子进程这些概念。我相信,本章将会为后续学习提供非常有用的帮助。本章内容将基于win10系统,为大家展现一个具体化的进程、线程、协程,能够了解他们是怎么工作的。
本文为python并发编程的第三篇,上一篇文章地址如下:
python:并发编程(二)_Lion King的博客-CSDN博客
下一篇文章地址如下:
(暂无)
一、监控进程
以Pycharm应用为例,如下图,我们来查看任务管理器显示的进程情况。其中,pycharm应用打开之后,有很多进程,这是为什么呢?
1、一个应用只有一个主进程
在大多数操作系统中,一个应用程序通常只有一个主进程,也被称为主线程。主进程是应用程序的入口点,负责程序的启动和执行。它会创建和管理其他的子进程或线程来执行特定的任务。
然而,有些应用程序可能会创建多个进程,每个进程都有自己的独立执行环境。这种情况下,每个进程都可以有自己的主线程。例如,某些应用程序可能会将某些任务或功能分配给不同的进程,以实现并行处理或提高系统的性能。
总结起来,一个应用程序通常有一个主进程或主线程,但也可以创建额外的进程来执行特定的任务或实现特定的功能。这取决于应用程序的设计和需求。
而这额外的进程,其实就是子进程。
2、如何区分主进程
首先,通过任务管理器有时候是看不出主进程的。细心的朋友可能会发现,有些应用在PID那一栏直接显示了进程号,那个其实就是主进程;而Pycharm应用那一行却没有显示进程号,那是因为主进程号在应用下面了。
在 Windows 10 任务管理器中,当你看到应用没有显示进程而只有子进程时,这可能是由于任务管理器的显示方式以及进程的层次结构导致的。
在任务管理器中,进程通常按层次结构显示。主要的父进程(例如浏览器或编辑器)将显示为应用程序名称,并且可能没有明确的进程标识符(PID)。相反,这些父进程下面会有一系列的子进程,每个子进程都有自己的进程标识符(PID)。这些子进程通常负责执行应用程序的各个任务,例如渲染网页、处理文件操作等。
所以,当你在任务管理器中看到应用程序没有显示进程而只有子进程时,实际上是因为任务管理器更关注显示子进程,而将父进程(应用程序)隐藏或不明确显示。这种显示方式有助于更好地组织和管理进程,并提供更清晰的进程层次结构信息。
因此,我们可以通过Process Explorer工具的层级结构清晰地看到主进程为11668,展示如下:
二、监控线程
资源监视器是Windows提供的一个工具,可以提供更详细的系统资源使用情况,包括进程、线程、内存、磁盘、网络等方面的信息。
通过资源监视器,可以监控和管理正在运行的线程,提供了更高级的功能和信息展示。你可以通过以下步骤打开资源监视器:
(1)打开任务管理器:按下"Ctrl + Shift + Esc"键组合来打开任务管理器。
(2)切换到"性能"选项卡:在任务管理器中,切换到"性能"选项卡。
(3)打开资源监视器:在"性能"选项卡中,点击下方的"资源监视器"按钮或在菜单栏中选择"资源监视器"。
(4)监控线程:在资源监视器中,可以选择"线程"选项卡,查看当前运行的线程的详细信息,包括线程ID、优先级、状态、CPU使用情况等。
资源监视器提供了更丰富的线程监控和管理功能,可以更直观地查看线程的使用情况和性能统计。通过资源监视器,你可以深入了解线程的活动,并进行必要的调整和优化。
需要注意的是,对于一些高级的线程监控和分析需求,可能需要使用专门的性能分析工具或第三方工具,以获得更深入的线程相关信息和性能指标。
三、监控协程
其实在Windows操作系统中,没有现成的工具来监控,可能需要使用第三方工具。因为协程的监控和调试相对于线程和进程来说较为复杂。传统的调试工具和监控工具通常更专注于线程和进程级别的调试,对于协程的监控支持较为有限。
那怎么办呢?
要么找到第三方工具,要么使用我提供的方案:其实,Python中的asyncio
库提供了一些调试工具,可以用于监控和跟踪协程的执行。其中包括asyncio.all_tasks()
函数可以获取当前运行的所有协程任务,asyncio.Task
对象提供了一些属性和方法用于监控协程的状态和执行情况,以及asyncio.get_event_loop()
函数可以获取当前的事件循环对象。
这里暂不进行实操,后续文章会实验。
四、子进程的那些事儿
1、什么是子进程
子进程是由父进程创建的新进程。在操作系统中,当一个进程创建了一个子进程,那么这个新创建的进程就被称为子进程,而原始的进程则被称为父进程。
子进程与父进程相互独立,它们有自己的代码段、数据段和堆栈空间。子进程可以执行与父进程不同的程序代码,拥有自己的资源和执行环境。子进程可以继承父进程的一些属性,例如文件描述符、环境变量等,但也可以在创建时进行修改。
子进程通常用于并行处理、任务分发和执行特定的功能。父进程可以通过与子进程进行通信来传递数据、控制子进程的行为,或者等待子进程的完成。
在某些情况下,子进程也可以创建自己的子进程,形成进程的层次结构。这样的层次结构可以实现更复杂的进程间通信和协作。
总结而言,子进程是由父进程创建的新进程,它们相互独立,可以执行不同的代码,拥有自己的资源和执行环境。子进程常用于并行处理和执行特定任务。
2、子进程又有子进程,是无限的么
在理论上,子进程可以创建自己的子进程,形成无限的子进程层次结构。每个子进程都有能力创建更多的子进程,以实现更复杂的进程间通信和协作。
然而,在实际应用中,通常会对子进程的层次结构进行限制或控制。操作系统或编程语言通常会设置一定的限制,如最大进程数、资源限制等,以确保系统的稳定性和性能。此外,设计良好的应用程序通常会使用适当的进程管理策略,避免无限制地创建子进程。
因此,尽管在理论上子进程可以无限创建子进程,但在实际应用中,通常会有限制和控制。具体的限制取决于操作系统和应用程序的设计。
比如,在Windows 10系统中,存在一些限制和限制策略,以确保系统的稳定性、安全性和性能。具体什么限制,这里不展开讲。