如何使用python的多处理来终止进程

2023-12-20

我有一些代码需要针对其他几个系统运行,这些系统可能会挂起或出现不受我控制的问题。我想使用 python 的多处理来生成子进程以独立于主程序运行,然后当它们挂起或出现问题时终止它们,但我不确定解决此问题的最佳方法。

当调用终止时,它确实会杀死子进程,但随后它会变成一个已失效的僵尸进程,直到进程对象消失才被释放。下面的示例代码中的循环永远不会结束,可以杀死它并允许再次调用时重生,但似乎不是解决此问题的好方法(即 multiprocessing.Process() 在 __init__() 中会更好)。

有人有建议吗?

class Process(object):
    def __init__(self):
        self.thing = Thing()
        self.running_flag = multiprocessing.Value("i", 1)

    def run(self):
        self.process = multiprocessing.Process(target=self.thing.worker, args=(self.running_flag,))
        self.process.start()
        print self.process.pid

    def pause_resume(self):
        self.running_flag.value = not self.running_flag.value

    def terminate(self):
        self.process.terminate()

class Thing(object):
    def __init__(self):
        self.count = 1

    def worker(self,running_flag):
        while True:
            if running_flag.value:
                self.do_work()

    def do_work(self):
        print "working {0} ...".format(self.count)
        self.count += 1
        time.sleep(1)

您可以将子进程作为后台守护程序运行。

process.daemon = True

守护进程中的任何错误和挂起(或无限循环)都不会影响主进程,并且只有在主进程退出后才会终止。

这适用于简单的问题,直到您遇到大量子守护进程,这些子守护进程将在没有任何显式控制的情况下不断从父进程获取内存。

最好的方法是设置一个Queue让所有子进程与父进程通信,以便我们可以join他们并很好地清理干净。这是一些简单的代码,用于检查子进程是否挂起(又名time.sleep(1000)),并向队列发送一条消息,供主进程对其采取操作:

import multiprocessing as mp
import time
import queue

running_flag = mp.Value("i", 1)

def worker(running_flag, q):
    count = 1
    while True:
        if running_flag.value:
            print(f"working {count} ...")
            count += 1
            q.put(count)
            time.sleep(1)
            if count > 3:
                # Simulate hanging with sleep
                print("hanging...")
                time.sleep(1000)

def watchdog(q):
    """
    This check the queue for updates and send a signal to it
    when the child process isn't sending anything for too long
    """
    while True:
        try:
            msg = q.get(timeout=10.0)
        except queue.Empty as e:
            print("[WATCHDOG]: Maybe WORKER is slacking")
            q.put("KILL WORKER")

def main():
    """The main process"""
    q = mp.Queue()

    workr = mp.Process(target=worker, args=(running_flag, q))
    wdog = mp.Process(target=watchdog, args=(q,))

    # run the watchdog as daemon so it terminates with the main process
    wdog.daemon = True

    workr.start()
    print("[MAIN]: starting process P1")
    wdog.start()

    # Poll the queue
    while True:
        msg = q.get()
        if msg == "KILL WORKER":
            print("[MAIN]: Terminating slacking WORKER")
            workr.terminate()
            time.sleep(0.1)
            if not workr.is_alive():
                print("[MAIN]: WORKER is a goner")
                workr.join(timeout=1.0)
                print("[MAIN]: Joined WORKER successfully!")
                q.close()
                break # watchdog process daemon gets terminated

if __name__ == '__main__':
    main()

不终止worker, 尝试join()从那时起它到主进程就会永远阻塞worker从未完成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用python的多处理来终止进程 的相关文章

  • 如何查看Databricks中的所有数据库和表

    我想列出 Azure Databricks 中每个数据库中的所有表 所以我希望输出看起来像这样 Database Table name Database1 Table 1 Database1 Table 2 Database1 Table
  • Django 管理员在模型编辑时间歇性返回 404

    我们使用 Django Admin 来维护导出到我们的一些站点的一些数据 有时 当单击标准更改列表视图来获取模型编辑表单而不是路由到正确的页面时 我们会得到 Django 404 页面 模板 它是偶尔发生的 我们可以通过重新加载三次来重现它
  • SQLAlchemy 通过关联对象声明式多对多自连接

    我有一个用户表和一个朋友表 它将用户映射到其他用户 因为每个用户可以有很多朋友 这个关系显然是对称的 如果用户A是用户B的朋友 那么用户B也是用户A的朋友 我只存储这个关系一次 除了两个用户 ID 之外 Friends 表还有其他字段 因此
  • 将数据从 python pandas 数据框导出或写入 MS Access 表

    我正在尝试将数据从 python pandas 数据框导出到现有的 MS Access 表 我想用已更新的数据替换 MS Access 表 在 python 中 我尝试使用 pandas to sql 但收到错误消息 我觉得很奇怪 使用 p
  • 将 Matplotlib 误差线放置在不位于条形中心的位置

    我正在 Matplotlib 中生成带有错误栏的堆积条形图 不幸的是 某些层相对较小且数据多样 因此多个层的错误条可能重叠 从而使它们难以或无法读取 Example 有没有办法设置每个误差条的位置 即沿 x 轴移动它 以便重叠的线显示在彼此
  • OpenCV Python cv2.mixChannels()

    我试图将其从 C 转换为 Python 但它给出了不同的色调结果 In C Transform it to HSV cvtColor src hsv CV BGR2HSV Use only the Hue value hue create
  • 如何在 Python 中检索 for 循环中的剩余项目?

    我有一个简单的 for 循环迭代项目列表 在某些时候 我知道它会破裂 我该如何退回剩余的物品 for i in a b c d e f g try some func i except return remaining items if s
  • 使用 on_bad_lines 将 pandas.read_csv 中的无效行写入文件

    我有一个 CSV 文件 我正在使用 Python 来解析该文件 我发现文件中的某些行具有不同的列数 001 Snow Jon 19801201 002 Crom Jake 19920103 003 Wise Frank 19880303 l
  • Spark KMeans 无法处理大数据吗?

    KMeans 有几个参数training http spark apache org docs latest api python pyspark mllib html highlight kmeans pyspark mllib clus
  • 以编程方式停止Python脚本的执行? [复制]

    这个问题在这里已经有答案了 是否可以使用命令在任意行停止执行 python 脚本 Like some code quit quit at this point some more code that s not executed sys e
  • Python pickle:腌制对象不等于源对象

    我认为这是预期的行为 但想检查一下 也许找出原因 因为我所做的研究结果是空白 我有一个函数可以提取数据 创建自定义类的新实例 然后将其附加到列表中 该类仅包含变量 然后 我使用协议 2 作为二进制文件将该列表腌制到文件中 稍后我重新运行脚本
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一
  • 如何在Python中获取葡萄牙语字符?

    我正在研究葡萄牙语 角色看起来很奇怪 我怎样才能解决这个问题 代码 import feedparser import random Vou definir os feeds feeds conf feedurl http pplware s
  • BeautifulSoup 中的嵌套标签 - Python

    我在网站和 stackoverflow 上查看了许多示例 但找不到解决我的问题的通用解决方案 我正在处理一个非常混乱的网站 我想抓取一些数据 标记看起来像这样 table tbody tr tr tr td td td table tr t
  • 如何在ipywidget按钮中显示全文?

    我正在创建一个ipywidget带有一些文本的按钮 但按钮中未显示全文 我使用的代码如下 import ipywidgets as widgets from IPython display import display button wid
  • Flask如何获取请求的HTTP_ORIGIN

    我想用我自己设置的 Access Control Allow Origin 标头做出响应 而弄清楚请求中的 HTTP ORIGIN 参数在哪里似乎很混乱 我在用着烧瓶 0 10 1 以及HTTP ORIGIN似乎是这个的特点之一object
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • 向 Altair 图表添加背景实心填充

    I like Altair a lot for making graphs in Python As a tribute I wanted to regenerate the Economist graph s in Mistakes we

随机推荐

  • 空对象设计模式问题

    我最近看了这个 YouTube 教程 http www youtube com watch v hp1Y9bhail8关于空对象设计模式 尽管其中存在一些错误 例如不执行任何操作的 NullCar 会创建无限循环 但这个概念得到了很好的解释
  • 将视点转换为 MKMapView 坐标

    我的目标是将视图的左上角和右下角转换为纬度 经度坐标 这些纬度 经度坐标将用于查询仅存在于视图中的注释位置 并非全部 5000 我找到了这个Stackoverflow 上的 Objective C 技巧 http stackoverflow
  • 什么时候调用属性?

    我对某些代码感到困惑 在班级中我有一个财产 Class A ClassB objB public int TimedValue objB Timer Inside classB I have classB public int Timer
  • 推送到不同存储库时自动触发 Travis?

    有没有办法在每次推送到存储库 Y 时触发存储库 X 的 Travis CI 构建 具体来说 我希望每次有推送时都启动我的构建http github com tensorflow tensorflow http github com tens
  • 如何列出 .so 文件中的符号

    如何列出从 so 文件导出的符号 如果可能的话 我还想知道它们的来源 例如 如果它们是从静态库中提取的 我正在使用 gcc 4 0 2 如果这有什么区别的话 列出符号的标准工具是nm 你可以像这样简单地使用它 nm gD yourLib s
  • Android - 创建Word文档

    我想创建word doc 和excelAndroid 平台上的 xls 文件 对于Excel我可以使用jexeljar 但我找不到任何用于 word 文件的 API 你能告诉我是否有任何开源 免费的API可以在android平台上编写wor
  • 如何保存 Linq-to-SQL 中的更改?

    所以 这是我对这个常见问题的独特见解 我执行查询 获取对象 然后将对象传递到表单中 并使用对象中的数据填充表单 这不是通过引用传递的 然后 我编辑 通过表单 查询的对象的值 然后返回根据表单中的值构造的新对象 然后我想将其更新到数据库 At
  • Wildfly 8 AS 中的热部署位置

    在JBoss 6 AS中 热部署位置是 JBOSS HOME server default deploy我可以在其中解压 WAR 或 EAR 并更改任何配置文件的内容 并且无需重新启动即可工作 同样 在Wildfly 8 AS中 任何人都可
  • Swift 无法定位和读取属性列表 (.plist) 文件

    我在让一个简单的命令行 OSX Swift 程序从一个简单的 plist XML 文件中读取数据时遇到了一个真正的问题 事实上 该程序甚至看不到该文件 尽管它似乎存在并复制到捆绑包中 数据由一个类处理 该类旨在读取 plist 数据并将其复
  • 如何从 highcharts 制作响应式饼图

    几天以来 我一直在尝试从 highcharts 中制作一个响应式饼图 我正在从事一个中等规模的项目 有时很容易失去概览 我已经检查过了 http www angulartutorial net 2014 03 responsive high
  • 向现有 Corda 网络添加新节点

    我正在尝试在 corda 网络中添加新节点和现有节点 我是作为文档做的 但无法实现 正如文档中所述 这足以创建一个包含 node conf 的文件夹吗 如果那么它在运行引导程序时不会更新文件夹中的数据和信息 但我可以通过添加 corda 和
  • 单元测试中的修补不起作用,正在调用实际方法

    我有一个 python 文件 update baseline manifest py 现在 我正在编写单元测试 想要修补 read file 和 write file 我已经这样做了 def update baseline manifest
  • 覆盖 dll 类属性集

    我在我的项目中使用了一千个封闭的 DllClass 实例 public sealed class DllClass public DllClass public string DllClassProperty get set DllClas
  • 获取异常 JDBC 类型没有方言映射

    我是 hibernate 和 java 的新手 我正在尝试执行本机 sql 查询 但我被卡住了 任何人都可以帮助我或检查我在哪里做错了吗 我的java代码是 try trns session beginTransaction String
  • Django 和 node.js :抛出参数[1]; // 未处理的“错误”事件

    我正在尝试 Django socket io 和 node js 示例实时 Django https github com mburst django realtime tutorial git 当我尝试从浏览器发送消息时 我从节点服务器收
  • 如何绘制具有两个刻度的 x 轴?

    我想画一个有两个刻度的x轴 如下图所示 ggplot2版本可以是这样的 library ggplot2 x c 1 2 3 4 5 10 20 30 40 50 y c 1 2 2 3 4 2 1 3 5 5 You should intr
  • 无法让 Robotium 在 Android Studio 中工作

    我正在努力让 Robotium 在基于 gradle 的 Android Studio 上工作 但我找不到方法 这是我的 build gradle 文件 buildscript dependencies repositories maven
  • 展平 JToken

    假设我有以下 JToken data company ID 12345 location Some Location name Some Name 我想将此令牌传递到输出此 JToken 的 FlattenToken 函数中 data co
  • 什么是代表图例或图表键的好图标?

    我正在实现一个小型网络应用程序小部件 它显示图表 或图表 地图 图形 其他 的图例 键 但仅在鼠标悬停在小部件上时显示 它基本上只是一个带有背景图像的 div 什么是一个好的图标来向不熟悉的用户传达 我展示传奇 或 我就是传奇 我正在寻找
  • 如何使用python的多处理来终止进程

    我有一些代码需要针对其他几个系统运行 这些系统可能会挂起或出现不受我控制的问题 我想使用 python 的多处理来生成子进程以独立于主程序运行 然后当它们挂起或出现问题时终止它们 但我不确定解决此问题的最佳方法 当调用终止时 它确实会杀死子