首页 > 解决方案 > 使用join()后如何在执行过程中终止进程?

问题描述

我想在执行过程中杀死某个进程或所有进程。我的示例代码如下。我怎样才能做到这一点?在这里,我想根据当前时间终止进程。如果时间可以被 2 整除,我想终止进程,否则不会。

import time
from multiprocessing import Process


def runTests(a, b):
    time.sleep(10)
    return a + b


def main(kill_processes):
    print(kill_processes)
    processes = []

    for i in range(3):
        print(i)
        proc = Process(target=runTests, args=(2, 4,))
        processes.append(proc)
        proc.start()

    for proc in processes:
        proc.join()
        if kill_processes:
            print("killing")
            proc.terminate()


if __name__ == "__main__":
    if round(time.time()) % 2 == 0:
        main(True)
    else:
        main(False)

标签: pythonmultiprocessingpython-multiprocessing

解决方案


这说明了如何通过以类似于我建议您查看的问题multiprocessing in stoppable multithreading的答案中的方式使用多个线程来做到这一点。

基本上,所有的join()调用都是在单独的线程中完成的,所以它们不会阻塞主进程中的主线程——这使得它可以杀死它们。

import threading
import time
from multiprocessing import Process


def runTests(a, b):
    time.sleep(10)
    return a + b

def create_process(lock, i):
    proc = Process(target=runTests, args=(2, 4,))
    print(f'{proc.name} created')
    proc.start()
    with lock:
        processes.append(proc)
    proc.join()


def main(kill_processes):
    global processes
    N = 3
    lock = threading.RLock()
    processes = []

    print(f'main({kill_processes=})')

    for i in range(N):
        thread = threading.Thread(target=create_process, args=(lock, i))
        thread.start()

    while True:  # Wait for all processes to have been created.
        with lock:
            if len(processes) == N:
                break
            else:
                time.sleep(.001)

    if kill_processes:
        print("Killing the processes")
        for proc in processes:
            proc.terminate()
            print(f'process {proc} terminated')



if __name__ == "__main__":
    main(True)

#    if round(time.time()) % 2 == 0:
#        main(True)
#    else:
#        main(False)

推荐阅读