python 3 中的os.getpid() 与 os.getpgid()

本文分享了作者在调试代码过程中,因误将获取进程ID的os.getpid()写成os.getpgid()而遇到的问题。通过此错误,详细解释了os.getpid()、os.getppid()、os.getpgid()及os.getsid()函数的用途,提醒开发者们在编程时要细心谨慎。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天调试代码遇到一个小问题,代码如下:

def worker(msg):
    t_start = time.time()
    print("%s start process, this id is: %d" % (msg, os.getpgid()))
    time.sleep(random.random() * 2)
    t_stop = time.time()
    print(msg, "finish, this time is %d0,2f" % (t_stop - t_start))

本意是查看系统的pid进程os.getpid(),不小心写成了os.getpgid(),报错“AttributeError: module 'os' has no attribute 'getpgid'”。

找了好一会没看出原因,最后翻看函数表才发现问题,为自己的粗心留个贴。时刻告诫自己小心谨慎。

os.getpgid(pid)

返回进程ID为pid的进程的组ID,如果pid=0,则返回当前调用进程的进程组ID

os.getpid()

返回当前进程的进程ID

os.getppid()

返回当前进程的父进程的ID

os.getsid(pid)

返回进程ID为pid的进程所在的会话的会话ID

### 如何正确退出或终止子进程 为了确保 `subprocess` 模块中的子进程能够被安全地关闭,可以采用多种方法来实现这一目标。一种常见的做法是利用 `Popen.terminate()` 或者更强制的方式如 `Popen.kill()` 方法。 对于某些情况下的进程管理需求,可能还需要处理僵尸进程的问题,这可以通过设置 `preexec_fn=os.setsid` 来创建一个新的会话[^2]。当希望向特定的子进程发送信号时,如果是在类 Unix 系统上,则可考虑使用 `os.killpg(os.getpgid(proc.pid), signal.SIGTERM)` 的方式;而在 Windows 平台上则适用如下所示的方法: ```python import os import subprocess import sys def terminate_process(child_pid): try: if sys.platform.startswith('win'): subprocess.check_output(f"Taskkill /PID {child_pid} /F", shell=True)[^1] else: os.kill(child_pid, 9) # SIGKILL on Unix-like systems except Exception as e: print(e) # 获取当前进程ID以便于测试 current_pid = os.getpid()[^3] # 创建一个示例子进程用于演示目的 proc = subprocess.Popen(['echo', 'hello'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 终止该子进程 terminate_process(proc.pid) ``` 上述代码片段展示了如何跨平台地结束由 `subprocess.Popen` 启动的子进程。需要注意的是,在实际应用中应当谨慎对待强行杀死进程的行为,因为这样可能导致数据丢失等问题。通常建议先尝试优雅地请求程序停止运行再采取进一步措施。 #### 关闭标准输入/输出流 除了直接操作操作系统级别的命令外,还可以通过控制 Popen 对象的标准 I/O 流来进行更加精细的操作。例如,调用 `communicate()` 可以等待子进程完成并读取其输出,而不会造成死锁风险。此外,也可以显式地关闭这些管道连接以促使子进程尽快退出。 ```python stdout, stderr = proc.communicate() print(stdout.decode()) if stderr: print("Errors occurred:", stderr.decode()) ``` 此段代码说明了怎样子进程交互以及获取它的执行结果,这对于调试非常有用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值