我将几个线程与子线程一起使用。现在,我想停止父线程或等到父线程完成其工作,而不检查并停止所有子线程。 我的想法是用进程包装父线程,然后终止进程,这似乎终止了带有所有子进程的相应父线程。
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
我不确定这是否是解决问题的正确方法
答案 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绑定的任务,则可以使用多处理(可能以进程池的形式)。