【发布时间】:2014-04-16 06:10:51
【问题描述】:
我正在使用 MultiProcess 库生成一个 python 进程,并在其中生成大约 100 个线程(3 种类型,每个执行一个单独的函数并使用一个队列)。
我希望我的进程在引发 db 标志时终止所有线程和进程本身,并在一切结束后设置一个 db 级别终止标志。
这是我的方法: 一旦在数据库中设置了一个标志(我可以在产生线程后在进程代码的末尾轮询数据库),我就可以退出退出我的进程的轮询循环。要杀死所有线程,我必须保留一个线程 ID 的数组,并向所有线程发送一个 kill。 我需要所有线程连同它们的连接一起被杀死(线程连接到 mysql、mongo 并且有一个 websocket 连接线程到另一台服务器)。
如果有人有更好的方法或者我的方法有任何缺点,请提出建议。
【问题讨论】:
-
您将多线程和多处理混为一谈。如果您使用模块
multiprocessing,那么您可能没有任何线程,只有进程。它们可以自行终止,也可以通过发送信号从外部杀死。如果你有线程,如果进程终止,这些将自动死亡;那么除了终止父亲之外,您无需做任何其他事情。 -
我在使用多处理创建的进程内部创建了线程实现的线程。我希望我的进程和线程在引发标志时死亡。如果我在我的进程中为这些线程发送终止信号,我不确定现有的 db/websocket 连接是否会正确终止,即连接已关闭。
-
对于套接字,您可能需要检查
SO_LINGER套接字选项。 -
你只需要确保进程被杀死。然后每个进程将拉下它的所有线程(以一种非常不受控制的方式)。
标签: python multithreading multiprocessing multiprocess