There is something it doesn't like about the pid and I don't know where the pid is coming from. Because we use what we know, I use multiprocessing (example below) because I know multiprocessing works, and because multiprocessing will use multiple cores when available, so try modifying this code to fit you, and see if it works any better, and obviously post back if it doesn't.
And I got so caught up in psutil that I didn't post terminating each process. This is better than psutil because you can join() each process, which allows anything in the background to be cleaned up.
## very basic and simple but should do the trick import multiprocessing import os import psutil import time def killtree(pid, including_parent=True): parent = psutil.Process(pid) for child in parent.children(recursive=True): print("killing child", child) child.kill() if including_parent: parent.kill() def print_numbers(spaces): ctr = 0 for x in range(11): ctr +=1 print(" "*spaces, ctr) time.sleep(0.5) ## do this first as it gets the latest pid started ## should be the pid of this program ## if you wait and the OS starts another process, you wil get that pid pid=os.getpid() list_of_multis=[] for ctr in range(5): list_of_multis.append(multiprocessing.Process(target=print_numbers, args=(ctr,))) list_of_multis[-1].start() ## wait 2 seconds and kill all processes time.sleep(2) killtree(pid)
And I got so caught up in psutil that I didn't post terminating each process. This is better than psutil because you can join() each process, which allows anything in the background to be cleaned up.
import multiprocessing import time def print_numbers(spaces): ctr = 0 for x in range(11): ctr +=1 print(" "*spaces, ctr) time.sleep(0.5) list_of_multis=[] for ctr in range(5): list_of_multis.append(multiprocessing.Process(target=print_numbers, args=(ctr,))) list_of_multis[-1].start() ## wait 2 seconds and kill all processes time.sleep(2) for process in list_of_multis: process.terminate() process.join() print(process, "terminated")