Python设置进程名称
技术背景
当我们在同一个机器上管理多个进程时,经常会遇到一个问题是,很多进程的名称可能是重复的。以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
参考链接
Python设置进程名称的更多相关文章
- python3 消耗CPU的性能,使CPU满载(可以设置进程名称)
需要安装库:setproctitle 1.1.10,设置进程名称,测试操作系统centos 7.0 # -*- coding: utf-8 -*- from multiprocessing im ...
- Python之进程
进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当代 ...
- {Python之进程} 背景知识 什么是进程 进程调度 并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 multiprocess模块 进程池和mutiprocess.Poll
Python之进程 进程 本节目录 一 背景知识 二 什么是进程 三 进程调度 四 并发与并行 五 同步\异步\阻塞\非阻塞 六 进程的创建与结束 七 multiprocess模块 八 进程池和mut ...
- Python之进程 进阶 下
在python程序中的进程操作 之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起 ...
- Python 线程&进程与协程
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
- Python:进程
由于GIL的存在,python一个进程同时只能执行一个线程.因此在python开发时,计算密集型的程序常用多进程,IO密集型的使用多线程 1.多进程创建: #创建方法1:将要执行的方法作为参数传给Pr ...
- python 守护进程 daemon
python 守护进程 daemon # -*-coding:utf-8-*- import sys, os '''将当前进程fork为一个守护进程 注意:如果你的守护进程是由inetd启动的,不要这 ...
- C#依据进程名称获取进程的句柄?
C#依据进程名称获取进程的句柄或C#怎样获取其它进程的句柄? 有时候标题名是动态变化的,所以不使用FindWindow方法! [StructLayout(LayoutKind.Sequential)] ...
- Python之进程 3 - 进程池和multiprocess.Poll
一.为什么要有进程池? 在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务.那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程么?首先,创建进程需要消耗 ...
- python的进程/线程/协程
1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有 ...
随机推荐
- Java 21的StringBuilder和StringBuffer新增了一个repeat方法
发现Java 21的StringBuilder和StringBuffer中多了repeat方法: /** * @throws IllegalArgumentException {@inheritDoc ...
- vscode编写markdown
1. 需求分析 2. 环境搭建 1. 需求分析 最近在网上折腾了好久Markdown的写作环境,作为一个普通用户,总结一下个人对于Markdown写作环境的几点需求.由于本人刚接触Markdown不久 ...
- 2023 ICPC 网络赛 I
没留够时间准备导致开考的时候耽搁了 开场我先写缺省源,抄串了一行,后面才发现...然后看了 L 发现是签到,此时 ddw 会了 A 让 zsy 上去写,我等了一会才把 zsy 撵下来写 L 是个失误 ...
- 基于Effect的组件设计
Effect的概念起源 从输入输出的角度理解Effect https://link.excalidraw.com/p/readonly/KXAy7d2DlnkM8X1yps6L 编程中的Effect起 ...
- python学习笔记(持续更新)
一.对列表的操作 #建立一个列表 list = [1,2,3,4] #打印列表 print(list) #在列表尾部添加元素 list.append(5) #在指定位置插入元素 list.insert ...
- [ABC218F] Blocked Roads 题解
Blocked Roads 题目大意 给定一张 \(n\) 个点,\(m\) 条边的无向图,每条边的边权均为 \(1\).对于每一个 \(i\in [1,m]\) 求出从点 \(1\) 到 \(n\) ...
- React项目中webpack的配置过程
初始化一个web项目 使用npm init -y 初始化一个项目 在项目目录下创建src, dist文件夹,创建webpack.config.js配置文件 然后在src文件夹下创建index.js, ...
- 浅析Redis大Key
一.背景 在京东到家购物车系统中,用户基于门店能够对商品进行加车操作.用户与门店商品使用Redis的Hash类型存储,如下代码块所示.不知细心的你有没有发现,如果单门店加车商品过多,或者门店过多时,此 ...
- 请教shell读写XML问题
请教shell读写XML问题 现有 123.xml文件,内容是:<?xml version="1.0" encoding="GBK"?><vi ...
- JUC并发编程学习笔记(十六)Volatile
Volatile 保证可见性 private volatile static Integer num = 0; 使用了volatile关键字,即可保证它本身可被其他线程的工作内存感知,即变化时也会被同 ...