0

I'm having trouble coming up with a piece of code that

  1. spawns multiple processes and
  2. for any individual process, kill the process if it is still alive after 5 secs

I know how to handle 1) and 2) individually, but I don't know how to combine them together. Any suggestions would be helpful. Thanks!

For 1) I know how to write a simple multi-process program with return dictionary from here:

import multiprocessing

def worker(procnum, return_dict):
    '''worker function'''
    print str(procnum) + ' represent!'
    return_dict[procnum] = procnum


if __name__ == '__main__':
    manager = multiprocessing.Manager()
    return_dict = manager.dict()
    jobs = []
    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(i,return_dict))
        jobs.append(p)
        p.start()

    for proc in jobs:
        proc.join()
    print return_dict.values()

For 2), my program hangs on some data, as a function, which is an external C++ extension of Python, will not return. Since there are one million data points to handle, I need to have a time-out killer that kills this function when it's running too long, and moves on to the next iteration. Currently I set a wait time of 5 seconds before killing this process. I know how to write the code from here:

import multiprocessing
import time

# bar
def bar():
    for i in range(100):
        print "Tick"
        time.sleep(1)

if __name__ == '__main__':
    # Start bar as a process
    p = multiprocessing.Process(target=bar)
    p.start()

    # Wait for 10 seconds or until process finishes
    p.join(10)

    # If thread is still active
    if p.is_alive():
        print "running... let's kill it..."

        # Terminate
        p.terminate()
        p.join()

But, as I mentioned, I am not sure know how to combine these two pieces of code together. Mainly because I don't know where to put the p.join() and if p.alive(). What's the use of p.join() since we already have `p.start()'?

Thanks!

yuqli
  • 4,461
  • 8
  • 26
  • 46
  • Add `time.sleep(5)` before `for proc in jobs:` and in the loop do `if proc.is_alive: proc.terminate()` because after `.sleep(5)` all have to be finished. – stovfl Apr 30 '19 at 16:47
  • I've written up some options for termination [here](https://stackoverflow.com/a/54932778/9059420). – Darkonaut May 03 '19 at 06:44

0 Answers0