技术背景

当我们在同一个机器上管理多个进程时,经常会遇到一个问题是,很多进程的名称可能是重复的。以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. Burp Suite抓包工具配置代理手机抓取数据包

    工作中很多手机上的问题因为环境差异导致无法在pc设备上完整的模拟真实物理手机,因此需要方法能抓取到手机设备上所有数据包发送详情.发现了这个好用的数据包抓取工具Burp Suite. 一.配置流程: 1 ...

  2. 关于Word转PDF的几种实现方案

    在.NET中,你可以使用Microsoft.Office.Interop.Word库来进行Word到PDF的转换.这是一个示例代码,但请注意这需要在你的系统上安装Microsoft Office. 在 ...

  3. poj2279

    Mr. Young's Picture Permutations Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5841   ...

  4. python-手机自动化环境部署

    关于ui-automator,google的官方介绍: https://developer.android.google.cn/training/testing/ui-automator https: ...

  5. [CF1178 F2] Long Colorful Strip

    F2 - Long Colorful Strip 很牛的题! 首先,我们可以将颜色相同的一段区间缩成一个点,那么每次加入一个新的颜色时,最多只能将其所覆盖的那个颜色所属的区间分成三部分(原本:0000 ...

  6. Java多线程编程的优点和缺点

    优点: 加快响应用户的时间:多线程允许并发执行多个任务,可以充分利用多核处理器,从而提高程序的性能和响应速度.比如我们经常用的迅雷下载,都喜欢多开几个线程去下载,谁都不愿意用一个线程去下载,为什么呢? ...

  7. mybatis-plus使用心得

    mybatis-plus是一款基于mybatis的持久层框架,在mybatis上只做增强不做改变.基本使用流程: 导入依赖坐标: <dependency> <groupId>c ...

  8. Redis 6 学习笔记 4 —— 通过秒杀案例,学习并发相关和apache bench的使用,记录遇到的问题

    背景 这是某硅谷的redis案例,主要问题是解决计数器和人员记录的事务操作 按照某硅谷的视频敲完之后出现这样乱码加报错的问题 乱码的问题要去tomcat根目录的conf文件夹下修改logging.pr ...

  9. GameFramework摘录 - 3. 使用interface定义对外接口

    GameFramework的模块密封性相当好,如果使用unity的assemblydef,其设计可以把框架项目与自己的游戏逻辑分离开来. 除一些常用的基类.枚举等,核心模块设置为internal权限, ...

  10. PKUSC & GDCPC 2023 游记

    离得太近,游记打算扔一起. 有没有神仙面基啊 /kel. PKUSC 2023 Day -? 突然听说不给 NOI Linux,震惊. 前情提要:在从 CSP 开始就全员强制 linux 的 LN 为 ...