技术背景

当我们在同一个机器上管理多个进程时,经常会遇到一个问题是,很多进程的名称可能是重复的。以Linux系统为例,进程名称默认使用的是argv[0]。这样一来,如果在一台机器上有很多个Python任务,使用ps -a命令就可以看到大量重名的python3进程。虽然这些进程ID是独一无二的,但是光看进程ID可能无法直观的分辨是谁在执行什么样的任务。这里我们可以使用python的setproctitle库来对进程名臣进行修改,让进程名称更加的直观。

安装与准备工作

可以直接通过pip来安装和管理setproctitle:

$ python3 -m pip install setproctitle
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting setproctitle
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/45/8d/68eec8de2d22a8ed6004344b35f94f2407ba723beee6ab468f162bb7be3e/setproctitle-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (31 kB)
Installing collected packages: setproctitle
Successfully installed setproctitle-1.3.3

安装完成后,我们用一个简单的示例来展示一下普通运行python代码的场景。如下代码的功能是,先打印进程ID和进程名称,然后休眠10秒时间:

import os
import time
import setproctitle proc_title = setproctitle.getproctitle()
print ('Process ID of this process is: {}'.format(os.getpid()))
print ('Process title of this process is: {}'.format(proc_title)) time.sleep(10)

这样一来,除了可以在终端窗口上面看到程序运行的代码输出之外,我们还可以有时间在另一个终端窗口上查看ps -a来进行比对。首先看下程序输出:

$ python3 proc_01.py
Process ID of this process is: 1516803
Process title of this process is: python3 proc_01.py

然后对比一下ps -a的输出内容,首先是运行proc_01.py之前查看ps -a的内容:

$ ps -a
PID TTY TIME CMD
530079 pts/2 08:37:09 nvitop
530867 pts/0 03:05:13 top
1516785 pts/7 00:00:00 ps

然后是运行proc_01.py之后查看ps -a的内容:

$ ps -a
PID TTY TIME CMD
530079 pts/2 08:37:09 nvitop
530867 pts/0 03:05:13 top
1516803 pts/4 00:00:00 python3 proc_01
1516804 pts/7 00:00:00 ps

这里我们发现多了一个1516803的进程,名称为python3 proc_01,跟上面程序输出的内容是一致的,只是在打印时自动省略了一些字符串的显示。

那么到这里我们就有可能遇到背景介绍中所提到的,如果同时运行100个相同的进程任务,那么在进程名称上是无法分辨的。接下来会使用到setproctitle的修改进程名称的功能。

修改进程名称

我们可以使用setproctitle的setproctitle()函数,来将进程名称设置成一个独一无二的编号,类似于进程ID。而这个独一无二的ID编号,我们一般用uuid来生成:

import os
import uuid
import time
import setproctitle proc_title = setproctitle.getproctitle()
print ('Process ID of this process is: {}'.format(os.getpid()))
print ('Process title of this process is: {}'.format(proc_title)) setproctitle.setproctitle('{}'.format(uuid.uuid1()))
proc_title = setproctitle.getproctitle()
print ('Process ID after modify proctitle is: {}'.format(os.getpid()))
print ('Process title after modify is: {}'.format(proc_title)) time.sleep(10)

程序的运行结果如下:

$ python3 proc_01.py
Process ID of this process is: 1517118
Process title of this process is: python3 proc_01.py
Process ID after modify proctitle is: 1517118
Process title after modify is: 73409484-a91c-11ee-9b4b-b07b25070cd2

我们可以看到,在进程ID不变的情况下,我们成功的把进程名称修改成了一个我们想要的字符串。同样的,如果是用ps -a也能够看到被修改后的进程名称:

$ ps -a
PID TTY TIME CMD
530079 pts/2 08:37:17 nvitop
530867 pts/0 03:05:16 top
1517118 pts/4 00:00:00 73409484-a91c-1
1517121 pts/7 00:00:00 ps

如果为了识别度更好一些,我们可以直接在进程名称上面把当前系统的用户名加上,这样即时是不同的用户跑同一个任务也可以进行区分。这里用户名我们通过os.getlogin()函数来获得:

import os
import uuid
import time
import setproctitle proc_title = setproctitle.getproctitle()
print ('Process ID of this process is: {}'.format(os.getpid()))
print ('Process title of this process is: {}'.format(proc_title)) setproctitle.setproctitle('{}-{}'.format(os.getlogin(), uuid.uuid1()))
proc_title = setproctitle.getproctitle()
print ('Process ID after modify proctitle is: {}'.format(os.getpid()))
print ('Process title after modify is: {}'.format(proc_title)) time.sleep(10)

输出结果如下:

$ python3 proc_01.py
Process ID of this process is: 1517417
Process title of this process is: python3 proc_01.py
Process ID after modify proctitle is: 1517417
Process title after modify is: dechin-f6808444-a91c-11ee-9809-b07b25070cd2

进程名称被成功修改。

总结概要

更好的管理系统进程,是每一个程序员的进阶必经之路。尤其是使用多进程、多用户的场景,系统内的进程是非常混乱的。如果在运行程序时都能控制好进程名称,那么就可以直接通过进程名称来监管和控制进程的执行和输出。本文介绍了setproctitle这样一个工具的简单使用,可以在python代码内部对进程进行管理。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/pname.html

作者ID:DechinPhy

更多原著文章:https://www.cnblogs.com/dechinphy/

请博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

参考链接

  1. https://www.cnblogs.com/lsdb/p/13299917.html

Python设置进程名称的更多相关文章

  1. python3 消耗CPU的性能,使CPU满载(可以设置进程名称)

    需要安装库:setproctitle    1.1.10,设置进程名称,测试操作系统centos 7.0 # -*- coding: utf-8 -*- from multiprocessing im ...

  2. Python之进程

    进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当代 ...

  3. {Python之进程} 背景知识 什么是进程 进程调度 并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 multiprocess模块 进程池和mutiprocess.Poll

    Python之进程 进程 本节目录 一 背景知识 二 什么是进程 三 进程调度 四 并发与并行 五 同步\异步\阻塞\非阻塞 六 进程的创建与结束 七 multiprocess模块 八 进程池和mut ...

  4. Python之进程 进阶 下

    在python程序中的进程操作 之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起 ...

  5. Python 线程&进程与协程

    Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...

  6. Python:进程

    由于GIL的存在,python一个进程同时只能执行一个线程.因此在python开发时,计算密集型的程序常用多进程,IO密集型的使用多线程 1.多进程创建: #创建方法1:将要执行的方法作为参数传给Pr ...

  7. python 守护进程 daemon

    python 守护进程 daemon # -*-coding:utf-8-*- import sys, os '''将当前进程fork为一个守护进程 注意:如果你的守护进程是由inetd启动的,不要这 ...

  8. C#依据进程名称获取进程的句柄?

    C#依据进程名称获取进程的句柄或C#怎样获取其它进程的句柄? 有时候标题名是动态变化的,所以不使用FindWindow方法! [StructLayout(LayoutKind.Sequential)] ...

  9. Python之进程 3 - 进程池和multiprocess.Poll

    一.为什么要有进程池? 在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务.那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程么?首先,创建进程需要消耗 ...

  10. python的进程/线程/协程

    1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有 ...

随机推荐

  1. MySQL系列之备份恢复——运维在备份恢复方面、备份类型、备份方式及工具、逻辑备份和物理备份、备份策略、备份工具使用-mysqldump、企业故障恢复案例、备份时优化参数、MySQL物理备份工具

    文章目录 1. 运维在数据库备份恢复方面的职责 1.1 设计备份策略 1.2 日常备份检查 1.3 定期恢复演练(测试库) 1.4 故障恢复 1.5 迁移 2. 备份类型 2.1 热备 2.2 温备 ...

  2. 快速启动Stable Diffusion WebUI

    快速启动Stable Diffusion WebUI详情    产品文档   输入文档关键字查找   机器学习PAI 产品概述 快速入门 操作指南 准备工作 开通PAI并创建默认工作空间 开通并授权依 ...

  3. Arduino基础入门之三按键开关

    目的:通过读取按键开关的信号,实现其他器件的控制 难点:下拉电阻和上拉电阻 一.关于按键开关 按键开关如上图[1]所示,但我拿到实物,最令我头疼的是按钮下边4个角,我不知那两边是相通的(就是和图中12 ...

  4. C#软件架构设计原则

    软件架构设计原则 学习设计原则是学习设计模式的基础.在实际的开发过程中,并不是一定要求所有的代码都遵循设计原则,而是要综合考虑人力.成本.时间.质量,不刻意追求完美,要在适当的场景遵循设计原则.这体现 ...

  5. 【学习】fhq-treap

    fhq-treap 是一种好写.复杂度低,且功能的优秀数据结构,涵盖了 treap 几乎所有的功能,其巧妙之处,就在于运用分离和合并两种操作代替了旋转操作. 1. BST 的定义 (摘自 OI Wik ...

  6. Oracle 11g数据库详解(2017-01-23更新)

    Oracle 11g数据库详解 整理者:赤勇玄心行天道 QQ:280604597 Email:280604597@qq.com 大家有什么不明白的地方,或者想要详细了解的地方可以联系我,我会认真回复的 ...

  7. SpringCloudAlibaba Seata在Openfeign跨节点环境出现全局事务Xid失效原因底层探究

    原创/朱季谦 曾经在SpringCloudAlibaba的Seata分布式事务搭建过程中,跨节点通过openfeign调用不同服务时,发现全局事务XID在当前节点也就是TM处,是正常能通过RootCo ...

  8. pta乙级1033(C语言)散列表解法

    #include"stdio.h" #include"string.h" int main() { int flag=1; char w[100010],ch[ ...

  9. vue3 移动端添加暗门 vconsole调试和显示隐藏

    一.说明 需求: 生产环境出bug,是app单点登录,没法调试,需要加一个vconsole,但是不影响其他用户使用,于是想到用暗门的方式 实现: 最终实现如上图,点击个人中心几个字,点击10次显示vc ...

  10. JSON文件解析工具类(java)

    JSON文本转JSONObject对象 当我们给前端返回样式的时候,需要处理json格式的前端样式,往往只需要改变局部数据.但是每次操作都要构造一个JSON对象,如果层级比较多的话,写法较为复杂,也不 ...