python multiprocessing.Pool kill *specific* long running or hung process

前端 未结 4 1785
死守一世寂寞
死守一世寂寞 2021-01-02 13:09

I need to execute a pool of many parallel database connections and queries. I would like to use a multiprocessing.Pool or concurrent.futures ProcessPoolExecutor. Python 2.7.

4条回答
  •  情歌与酒
    2021-01-02 13:43

    I am not fully understanding your question. You say you want to stop one specific process, but then, in your exception handling phase, you are calling terminate on all jobs. Not sure why you are doing that. Also, I am pretty sure using internal variables from multiprocessing.Pool is not quite safe. Having said all of that, I think your question is why this program does not finish when a time out happens. If that is the problem, then the following does the trick:

    from multiprocessing import Pool
    import time
    import numpy as np
    from threading import Timer
    import thread, time, sys
    
    def f(x):
        time.sleep(x)
        return x
    
    if __name__ == '__main__':
        pool = Pool(processes=4, maxtasksperchild=4)
    
        results = [(x, pool.apply_async(f, (x,))) for x in np.random.randint(10, size=10).tolist()]
    
        result = None
        start = time.time()
        while results:
            try:
                x, result = results.pop(0)
                print result.get(timeout=5), '%d done in %f Seconds!' % (x, time.time()-start)
            except Exception as e:
                print str(e)
                print '%d Timeout Exception! in %f' % (x, time.time()-start)
                for i in reversed(range(len(pool._pool))):
                    p = pool._pool[i]
                    if p.exitcode is None:
                        p.terminate()
                    del pool._pool[i]
    
        pool.terminate()
        pool.join()
    

    The point is you need to remove items from the pool; just calling terminate on them is not enough.

提交回复
热议问题