def start_pool(pool, timeout=1): with tempdir() as tmp: assert exists(tmp), tmp logpath = join(tmp, 'log') pool.init_kwargs.setdefault('_logpath', logpath) pool.init_kwargs.setdefault('_init', pool.init_func) pool.init_func = _logging_init with discard_tasks(pool.broker), printlog(logpath): pool.start(timeout=timeout, handle_sigterm=False) try: yield finally: if not pool.broker.url.startswith('memory:'): pool.broker.queue().noop() pool.stop()
def test_WorkerPool_sigterm(url): with tempdir() as tmp: logpath = join(tmp, 'output.log') proc = run_in_subprocess(worker_pool, url, WorkerPool_sigterm_init, (tmp, logpath), workers=3) with printlog(logpath), force_kill_on_exit(proc): q = get_queue(url) q.func('text') eventually(reader(tmp, 'func.started'), '') proc.terminate() # signal pool shutdown touch(join(tmp, 'func.unlock')) # allow func to proceed eventually(reader(tmp, 'func.out'), 'text') eventually(verify_shutdown(proc), True, timeout=WAIT)
def test_WorkerPool_worker_shutdown_on_parent_die(url): with tempdir() as tmp: logpath = join(tmp, 'output.log') proc = run_in_subprocess(worker_pool, url, WorkerPool_worker_shutdown_on_parent_die_init, (tmp, logpath)) with printlog(logpath), force_kill_on_exit(proc): res = get_queue(url).getpid() assert res.wait(WAIT), repr(res) os.kill(proc.pid, signal.SIGKILL) # force kill pool master eventually(proc.is_alive, False, timeout=WAIT) try: eventually(pid_running(res.value), False, timeout=WAIT, poll_interval=0.1) except Exception: os.kill(res.value, signal.SIGTERM) # clean up raise