终止线程和子线程

时间:2019-05-07 07:17:17

标签: python multithreading multiprocessing

我将几个线程与子线程一起使用。现在,我想停止父线程或等到父线程完成其工作,而不检查并停止所有子线程。 我的想法是用进程包装父线程,然后终止进程,这似乎终止了带有所有子进程的相应父线程。

def worker(conn):

    #this is the class including the parent thread
    xi = Test_Risk_Calc('99082')
    #start working
    xi.test()    
    #finished

    print ('EVERYTHING IS DONE, BUT CHILD THREADS ARE STILL ALIVE')
    conn.send('EXIT SEND')
    return

def main():
    parent_conn, child_conn = Pipe()
    p = multiprocessing.Process(target=worker, args=(child_conn,))
    p.start()
    #wait for finished parent-thread
    print(parent_conn.recv())
    p.terminate()
    p.join()
    print('JOINED, PROCESS AND ALL ITS THREADS ARE TERMINATED')
    return

我不确定这是否是解决问题的正确方法

1 个答案:

答案 0 :(得分:0)

我认为这没关系,就像您已经做到了一样。但是,您可以避免总是有些“困难”的“终止”。

一个简单的解决方案是使用参数“ daemon = True”启动子线程。如果它们的父线程终止,这实际上会自动终止子线程。

就像我之前说过的那样,这看起来可能更干净一些,但最终,我认为还是一样。

编辑:

也许考虑使用asyncio(async / await)进行并发编程。您可以使用

创建任务
task = asyncio.create_task(my_task())

并稍后取消这些任务

task.cancel()

这里的妙处是,此“取消”向任务抛出了异常。因此,在任务中,您可以执行以下操作:

async def my_task():
  try:
    ... stuff ...
  except asyncio.CancelledError:
    ... you can handle the cancellation, or ignore it

在python中,任务不是很有用。对于并发执行,您可以更好地使用asyncio,并且如果您有cpu绑定的任务,则可以使用多处理(可能以进程池的形式)。