파이썬에서 현재 프로세스의 pid와 쓰레드의 id 값을 어떻게 얻어올까요? 이 방법을 알아보겠습니다. 명령어는 window에 설치된 WSL-2, ubuntu 22.04 버전에서 실행하였습니다.

 


 

 먼저, os.getpid()로 현재 프로세스의 pid (process id)를 얻어올 수 있습니다.

 

 실행해 보겠습니다. python3 test.py를 실행시켜 보니, 130이라는 값이 출력됩니다.

 

 pstree가 깔려 있다면, pstree -p로 부모 프로세스와 자식 프로세스들을 한눈에 볼 수 있습니다. python3(130)이라고 되어 있습니다. 이는 python3 프로세스의 pid가 130이라는 것을 의미합니다. ps -aux 명령어를 입력해 보겠습니다.

 

 python3 ~ COMMAND를 입력해서 실행시킨 프로세스의 id가 130입니다. 일치함을 확인할 수 있습니다. os.getpid()로 현재 프로세스의 id를 얻어올 수 있습니다.

 


 현재 쓰레드 id는 threading 모듈의 get_ident()를 이용하면 얻어올 수 있습니다. 간단한 프로그램 하나를 만들어 봅시다.

 

 foo 함수와 baz 함수는 5초 동안 sleep을 한 다음에, 현재 thread의 고유 번호를 출력하고 끝냅니다.

 

 

 Thread t1과 t2를 foo와 baz를 실행하게 합시다. 그리고, t1과 t2를 start 시킨 다음에, 이들이 끝날 때 까지 대기하도록 하겠습니다. 결과가 어떻게 나올까요?

 

 140402703398464, 140402695005760이 나옵니다. 쓰레드 식별자가 반환됩니다. 그런데, threading에는 get_native_id() 라는 함수도 있습니다. 무슨 차이가 있을까요?

 

 get_ident() 대신에 get_native_id() 함수를 통해 id 값을 얻어오겠습니다.

 

 

 ps 명령어의 man 페이지를 보면, -L 옵션이 threads를 보여준다고 되어 있습니다. show LWP가 있네요. 먼저 test.py를 실행시킨 후에, 다른 세션에서 ps에 -eL 옵션을 붙인 다음에 제가 실행시킬 python3을 grep 조건으로 걸어 필터링 걸어 보겠습니다.

 

 

 잘 보면 196, 197, 198이 나옴을 알 수 있습니다. 이는 LWP입니다. Light Weight Process를 의미합니다. 196, 197, 198을 주목해 보겠습니다.

 

 test.py의 실행 결과는 197, 198이 나왔습니다. get_ident()와는 다르게 get_native_id()는 커널에 의해 할당된 쓰레드의 id 값을 얻어오게 됩니다.