使用multiprocessing设置进程名后psutil显示异常的问题求助
我尝试创建带有明确名称的Python进程,以便通过名称在psutil的迭代对象中找到它。目前创建的进程PID正确,但psutil显示的进程名为“python”,而非我设置的名称。我的目标是创建一批可确定的进程并监控其运行状态,除了名称外无法区分它们(我会用一个专门的进程来监控其他进程)。我最初以为是Windows系统问题,遂将项目迁移至Ubuntu,但问题依旧。我知道可以通过process.cmdline()找到所需名称,但好奇之前的方法存在什么问题。
示例代码:
process = multiprocessing.Process( name=service_config["service_type"], target=service.start_service ) process.start() print(process.pid) print(process.name)
打印结果:
9387 silly_service_name
multiprocessing.Process的name参数只是Python内部进程管理用的标识,它不会修改操作系统层面的进程名称。
psutil读取的是操作系统内核维护的进程信息,其中的进程名称对应的是启动进程的可执行文件(比如python、python3),和Python内部给进程对象设置的name属性完全是两回事。这个属性只在当前Python进程的multiprocessing模块范围内有效——比如用multiprocessing.active_children()获取子进程列表时,能看到这个自定义名称,但系统级别的工具(包括ps、top和psutil)都无法识别它。
你提到的process.cmdline()能找到所需信息,是因为子进程的命令行参数里会包含multiprocessing启动时的相关标识,若你在启动子进程时传递了自定义参数,也能在这里找到。这是因为cmdline是操作系统记录的进程启动命令,属于系统层面的信息,所以psutil能读取到。
内容的提问来源于stack exchange,提问作者Jonathan Pépin

