【问题标题】:Get process id of spawned process in Python Pebble library?在 Python Pebble 库中获取生成进程的进程 ID?
【发布时间】:2021-01-23 00:00:32
【问题描述】:
我正在使用来自Pebble 库的 ProcessPool 来启动一个容易崩溃的子进程。我想记录崩溃的子进程的进程ID,但来自主进程而不是子进程(原因是我在主进程中有一个日志行,其中包含与一个请求相关的一堆相关信息,其中我想包括这个而不是分散在多个日志行中)。有没有办法访问这个进程ID?我似乎无法在文档中找到此信息。
我想作为一种解决方法,我可以在使用 os.getpid() 执行任何操作之前在子进程中获取 pid,并使用 IPC 将其传回父进程。但如果可能的话,我想避免这种情况。
【问题讨论】:
标签:
python
concurrency
multiprocessing
concurrent.futures
【解决方案1】:
ProcessPool 旨在从用户那里抽象出其内部运作。因此,它隐藏了对用于执行工作程序的进程的访问。
如果您仅出于调试目的需要此信息,我的建议是使用唯一标识符标记您的作业,然后从工作进程中记录这些标识符和工作 PID。通过这种方式,您可以关联导致函数崩溃的工作。
def function(jobid, *args):
logging.debug("Job ID %d started on worker %d", jobid, os.getpid())
...
pool.schedule(function, (jobid, arg1, arg2))