捕获键盘中断以阻止 Python 多处理工作线程在队列上工作

2023-12-05

从 stackoverflow 上找到的几篇文章中,我创建了这段代码。

Scenario

我想要一个 multiprocessing.queue ,几个工人“听”

如果发生键盘中断,主进程不应再将新项目放入队列中,并且在哨兵对象的帮助下,工作人员应优雅地停止。

Problem

我使用的当前版本的问题

signal.signal(signal.SIGINT, signal.SIG_IGN) 

忽略Ctrl+C就是它也被主进程忽略。

有任何想法吗 ? 我需要使用多处理工作池吗?一些例子表明我可能必须这样做。那么我还可以使用队列吗?

from multiprocessing import Pool, Process,Queue
import time
import signal
# http://docs.python.org/3.1/library/multiprocessing.html#multiprocessing.Queue
# http://docs.python.org/3.1/library/multiprocessing.html#multiprocessing.Process


class Worker(Process):
    def __init__(self, queue,ident):
        super(Worker, self).__init__()
        # Ignore Signals
        signal.signal(signal.SIGINT, signal.SIG_IGN)
        self.queue= queue
        self.idstr= str(ident)
        print "Ident" + self.idstr

    def run(self):
        print 'Worker started'
        # do some initialization here

        print 'Computing things!'
        for data in iter( self.queue.get, None ):
            print "#" + self.idstr + " : " + str(data)
            time.sleep(5)
            print "#" + self.idstr + "Queue Size: " + str(self.queue.qsize())

        print "Worker Done"

#### Main ####
request_queue = Queue(10)

for i in range(4):
    Worker( request_queue,i ).start()

try:
    for data in range(1000000):
        request_queue.put( data )
        #print "Queue Size: " + str(request_queue.qsize())
        # Sentinel objects to allow clean shutdown: 1 per worker.
    for i in range(4):
        request_queue.put( None ) 

except KeyboardInterrupt:
    print "Caught KeyboardInterrupt, terminating workers"
    while  request_queue.empty()==False:
         request_queue.get()
    request_queue.put( None )    

根据您的解决方案(很好),我添加了额外的保护层,以防主代码无响应并且用户取消两次:

global STOP

import os, signal
def signal_handler(sig, frame):
    global STOP
    if STOP:
        signal.signal(signal.SIGINT, signal.SIG_IGN)
        os.kill(os.getpid(), signal.SIGTERM)
    STOP = True
signal.signal(signal.SIGINT, signal_handler)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

捕获键盘中断以阻止 Python 多处理工作线程在队列上工作 的相关文章

  • 让 VoiceChannel.members 和 Guild.members 返回完整列表的问题

    每当我尝试使用 VoiceChannel members 或 Guild members 时 它都不会提供适用成员的完整列表 我从文本命令的上下文中获取 VoiceChannel 和 Guild 如下所示 bot command name
  • pandas DataFrame.join 的运行时间是多少(大“O”顺序)?

    这个问题更具概念性 理论性 与非常大的数据集的运行时间有关 所以我很抱歉没有一个最小的例子来展示 我有一堆来自两个不同传感器的数据帧 我需要最终将它们连接成两个very来自两个不同传感器的大数据帧 df snsr1 and df snsr2
  • 多输出堆叠回归器

    一次性问题 我正在尝试构建一个多输入堆叠回归器 添加到 sklearn 0 22 据我了解 我必须结合StackingRegressor and MultiOutputRegressor 经过多次尝试 这似乎是正确的顺序 import nu
  • VSCode Settings.json 丢失

    我正在遵循教程 并尝试将 vscode 指向我为 Scrapy 设置的虚拟工作区 但是当我在 VSCode 中打开设置时 工作区设置 选项卡不在 用户设置 选项卡旁边 我还尝试通过以下方式手动转到文件 APPDATA Code User s
  • CIL 'fault' 子句与 C# 中的 'catch' 子句有何不同?

    根据CLI标准 http www ecma international org publications files ECMA ST ECMA 335 pdf 第 IIA 部分 第 19 章 和 MSDN 参考页System Reflect
  • 嵌套列表的重叠会产生不必要的间隙

    我有一个包含三个列表的嵌套 这些列表由 for 循环填充 并且填充由 if 条件控制 第一次迭代后 它可能类似于以下示例 a 1 2 0 0 0 0 0 0 4 5 0 0 0 0 0 0 6 7 根据条件 它们不重叠 在第二次迭代之后 新
  • python multiprocessing 设置生成进程等待

    是否可以生成一些进程并将生成进程设置为等待生成的进程完成 下面是我用过的一个例子 import multiprocessing import time import sys def daemon p multiprocessing curr
  • Python 3d 绘图设置固定色阶

    我正在尝试绘制两个 3d 数组 第一个数组的 z 值在范围内 0 15 0 15 第二个来自 0 001 0 001 当我绘图时 色标自动遵循数据范围 如何设置自定义比例 我不想看到 0 001 的浅色 而应该看到 0 15 的浅色 如何修
  • PyQt 使用 ctrl+Enter 触发按钮

    我正在尝试在我的应用程序中触发 确定 按钮 我当前尝试的代码是这样的 self okPushButton setShortcut ctrl Enter 然而 它不起作用 这是有道理的 我尝试查找一些按键序列here http ftp ics
  • Pycharm 在 os.path 连接上出现“未解析的引用”

    将pycharm升级到2018 1 并将python升级到3 6 5后 pycharm报告 未解析的引用 join 最新版本的 pycharm 不会显示以下行的任何警告 from os path import join expanduser
  • Python 3:将字符串转换为变量[重复]

    这个问题在这里已经有答案了 我正在从 txt 文件读取文本 并且需要使用我读取的数据之一作为类实例的变量 class Sports def init self players 0 location name self players pla
  • 嵌套作用域和 Lambda

    def funct x 4 action lambda n x n return action x funct print x 2 prints 16 我不太明白为什么2会自动分配给n n是返回的匿名函数的参数funct 完全等价的定义fu
  • Python - 如何确定解析的 XML 元素的层次结构级别?

    我正在尝试使用 Python 解析 XML 文件中具有特定标记的元素并生成输出 excel 文档 该文档将包含元素并保留其层次结构 我的问题是我无法弄清楚每个元素 解析器在其上迭代 的嵌套深度 XML 示例摘录 3 个元素 它们可以任意嵌套
  • Django REST Framework - CurrentUserDefault 使用

    我正在尝试使用CurrentUserDefault一个序列化器的类 user serializers HiddenField default serializers CurrentUserDefault 文档说 为了使用它 请求 必须作为
  • 找到一个数字所属的一组范围

    我有一个 200k 行的数字范围列表 例如开始位置 停止位置 该列表包括除了非重叠的重叠之外的所有类型的重叠 列表看起来像这样 3 5 10 30 15 25 5 15 25 35 我需要找到给定数字所属的范围 并对 100k 个数字重复该
  • 如果 PyPy 快 6.3 倍,为什么我不应该使用 PyPy 而不是 CPython?

    我已经听到很多关于PyPy http en wikipedia org wiki PyPy项目 他们声称它比现有技术快 6 3 倍CPython http en wikipedia org wiki CPython口译员开启他们的网站 ht
  • 每当使用 import cv2 时 OpenCV 都会出错

    我在终端上使用 pip3 install opencv contrib python 安装了 cv2 并且它工作了 但是每当我尝试导入 cv2 或运行导入了 cv2 的 vscode 文件时 在 python IDLE 上它都会说 Trac
  • 等待子进程使用 os.system

    我用了很多os system在 for 循环内调用创建后台进程 如何等待所有后台进程结束 os wait告诉我没有子进程 ps 我使用的是Solaris 这是我的代码 usr bin python import subprocess imp
  • 在virtualenv中下载sqlite3

    我正在尝试使用命令创建应用程序python3 manage py startapp webapp但我收到一条错误消息 django core exceptions ImproperlyConfigured 加载时出错 pysqlite2 或
  • pytest找不到模块[重复]

    这个问题在这里已经有答案了 我正在关注pytest 良好实践 https docs pytest org en latest explanation goodpractices html test discovery或者至少我认为我是 但是

随机推荐

  • JavaScript 函数队列

    我有大量的函数需要连续运行 但不能在其他函数完成之前运行 我需要的是一种方法 将这些函数排队 仅在前一个函数成功完成后运行 有任何想法吗 Function1 Function2 Function3 Function4 Function5 你
  • 具有 style 属性的元素的 CSS 选择器

    我有一个具有以下样式的元素 ul class textboxlist bits style background color transparent 现在我想根据样式属性选择元素 CSS 选择器ul style background col
  • Python 递归数独求解器不返回解决方案

    我尝试优化this代码和我的最终代码如下所示 import numpy as np sudoku np array 0 9 0 0 5 0 6 0 8 0 0 0 7 1 0 3 5 0 2 1 0 0 0 0 7 0 4 0 0 1 5
  • 测试迭代指针之间的关系是否安全?

    请考虑一系列Thing 这是一种堆栈 它是由thingsBottom 其空端由thingsTop EDIT 每次我想将某些东西推入列表时 我都会这样做 thingsTop newThing thingsTop 我想使用指针从末尾到开头迭代它
  • 对尚未进行 OCR 处理的 PDF 进行批量 OCR 处理

    如果我有 10 000 个 PDF 其中一些已进行 OCRed 其中一些有 1 页已进行 OCRed 但其余页面尚未进行 我如何才能浏览所有 PDF 并且仅对尚未进行 OCRed 的页面进行 OCR完成了吗 这正是我想要的 我有数千个扫描的
  • 单元测试 VSTO 项目

    在我遵循的大多数单元测试教程中 它让我创建第二个单元测试项目 然后将测试项目中的解决方案 项目引用添加到另一个项目 我有一个 VSTO 插件 当我添加引用时 我没有看到 解决方案 gt 项目 下列出的任何内容 为什么是这样 我还能如何添加对
  • Swift UIAlertController 获取文本字段文本

    当按下 输入 按钮时 我需要从警报视图中的文本字段中获取文本 func inputMsg var points var outOf var alertController UIAlertController title Input View
  • 面板无法在使用 JQuery Mobile 的所有页面中工作

    大家好 朋友们 我是 jQuery Mobile 的新手 正在尝试通过使用 jquery mobile 创建网站来学习东西 问题是我用过data role panel 在我的页面上显示导航它工作正常 但是当我跳转到同一 HTML 文件中的另
  • 帮助从外部网站获取 Json 格式数据

    我正在尝试从该网站获取 Json 格式数据 http www livetraffic sg feeds json 但是 当我使用 ajax 时 我在 chrome 控制台中遇到了这个特殊错误 错误 XMLHttpRequest 无法加载 A
  • 如何在 Windows 中不输入 python 来运行 python 脚本

    假设我在某个目录中有一个名为 myfile py 的 python 文件 如何直接调用 python 文件而不调用 python myfile py and not python myfile py Edit 更准确地说 仅在命令行中输入文
  • 在函数中返回大对象

    比较以下两段代码 第一段使用对大对象的引用 第二段将大对象作为返回值 对 大对象 的强调是指 不必要地重复对象的副本会浪费周期 使用对大对象的引用 void getObjData LargeObj a a reset a fillWithD
  • 从下拉选择更新图表

    我有一个 JavaScript 文件app js和一个 php 文件data php app js使用 JSON 输出中的数据创建图表data php See app jsbelow document ready function ajax
  • 将事件转换为任务的可重用模式

    我想要一段通用的可重用代码将 EAP 模式包装为任务 类似于什么Task Factory FromAsync为BeginXXX EndXXXAPM模式 E g private async void Form1 Load object sen
  • 带有标志 FLAG_ACTIVITY_CLEAR_TOP 的活动 (android)

    我接连发起了一系列活动 但在其中一项活动中 我需要使用标志启动该特定活动FLAG ACTIVITY CLEAR TOP 这样它将完成前面的所有活动并开始 我面临的问题是 我不想完成堆栈中的一项活动 它应该存在于新启动的活动的后面 假设我有活
  • azure webapp webjob 节点版本

    如何定义用于运行 azure webjobs 的节点版本 服务器当前使用 v0 11 执行我的代码 但由于我使用需要节点 gt 8 的功能而失败 Web 应用程序本身在节点 8 上运行得很好 但 webjobs 的版本似乎独立于 Web 服
  • 机器精度和双精度型的最大值和最小值

    1 我遇到过几种将 epsilon 添加到非负变量以保证非零值的情况 所以我想知道为什么不加上数据类型可以表示的最小值而不是epsilon呢 这两者能解决什么不同的问题 2 我还注意到双精度类型的最大值的倒数大于其最小值 并且其最小值的倒数
  • 在 python 中以 JSON 形式返回 SQL 表

    我正在 web py 中玩一个小网络应用程序 并设置一个 url 来返回 JSON 对象 使用 python 将 SQL 表转换为 JSON 的最佳方法是什么 这是一个非常好的例子一种Python式的方法来做到这一点 import json
  • 如何处理在 Linq 表达式内部创建的 IDisposableobject?

    Linq 允许您在查询表达式内创建新对象 当您有封装列表生成的类时 这非常有用 我想知道你如何处理创建的需要它的对象 Example class Generator public IEnumerable
  • 使用光标分页和使用偏移量分页之间的成本差异是多少?

    当使用 下一页 和 上一页 按钮创建结果页面时 使用光标执行此操作与使用偏移执行此操作之间的成本差异是多少 每种技术的优缺点是什么 举个具体的例子 读取结果100 110的成本是多少 我见过一些声称 offset 使用 小型数据存储操作 的
  • 捕获键盘中断以阻止 Python 多处理工作线程在队列上工作

    从 stackoverflow 上找到的几篇文章中 我创建了这段代码 Scenario 我想要一个 multiprocessing queue 几个工人 听 如果发生键盘中断 主进程不应再将新项目放入队列中 并且在哨兵对象的帮助下 工作人员