多线程 Python 中的信号处理

2023-12-27

这应该非常简单,我很惊讶我在 stackoverflow 上找不到这个问题的答案。

我有一个类似守护程序的程序,需要响应 SIGTERM 和 SIGINT 信号才能与 upstart 良好地配合。我读到,执行此操作的最佳方法是在与主线程不同的线程中运行程序的主循环,并让主线程处理信号。然后,当收到信号时,信号处理程序应该通过设置在主循环中定期检查的哨兵标志来告诉主循环退出。

我已经尝试这样做,但它没有按我预期的方式工作。请参阅下面的代码:

from threading import Thread
import signal
import time
import sys

stop_requested = False    

def sig_handler(signum, frame):
    sys.stdout.write("handling signal: %s\n" % signum)
    sys.stdout.flush()

    global stop_requested
    stop_requested = True    

def run():
    sys.stdout.write("run started\n")
    sys.stdout.flush()
    while not stop_requested:
        time.sleep(2)

    sys.stdout.write("run exited\n")
    sys.stdout.flush()

signal.signal(signal.SIGTERM, sig_handler)
signal.signal(signal.SIGINT, sig_handler)

t = Thread(target=run)
t.start()
t.join()
sys.stdout.write("join completed\n")
sys.stdout.flush()

我通过以下两种方式对此进行了测试:

1)

$ python main.py > output.txt&
[2] 3204
$ kill -15 3204

2)

$ python main.py
ctrl+c

在这两种情况下,我希望将其写入输出:

run started
handling signal: 15
run exited
join completed

在第一种情况下,程序退出,但我看到的是:

run started

在第二种情况下,当按下 ctrl+c 并且程序不退出时,SIGTERM 信号似乎被忽略。

我在这里缺少什么?


问题是,正如中所解释的Python 信号处理程序的执行 https://docs.python.org/3.4/library/signal.html#execution-of-python-signal-handlers:

Python 信号处理程序不会在低级 (C) 信号处理程序内执行。相反,低级信号处理程序会设置一个标志,告诉虚拟机稍后执行相应的 Python 信号处理程序(例如在下一个字节码指令处)

纯粹用 C 实现的长时间运行计算(例如对大量文本进行正则表达式匹配)可以不间断地运行任意时间,无论收到任何信号如何。计算完成后将调用 Python 信号处理程序。

你的主线程被阻塞了threading.Thread.join,这最终意味着它在 C 中被阻止pthread_join称呼。当然,这不是“长时间运行的计算”,它是系统调用上的一个块……但是,在该调用完成之前,您的信号处理程序无法运行。

并且,在某些平台上pthread_join将会失败EINTR在一个信号上,在其他信号上则不会。在linux上,我相信这取决于你选择BSD风格还是默认风格siginterrupt行为,但默认为否。


所以你对此能做些什么?

嗯,我很确定Python 3.3 中信号处理的变化 https://docs.python.org/3/whatsnew/3.3.html#signal实际上改变了 Linux 上的默认行为,因此升级时您无需执行任何操作;只需在 3.3+ 下运行,您的代码就会按您的预期工作。至少对我来说,OS X 上的 CPython 3.4 和 Linux 上的 3.3 是这样。 (如果我错了,我不确定这是否是 CPython 中的错误,所以你可能想在 python-list 上提出它而不是打开一个问题......)

另一方面,在 3.3 之前,signal模块绝对不会公开您自己解决此问题所需的工具。因此,如果您无法升级到 3.3,解决方案是等待可中断的事件,例如Condition or an Event。子线程在退出之前通知该事件,主线程在加入子线程之前等待该事件。这绝对是hacky。我找不到任何东西可以保证它会有所作为;它恰好适用于 OS X 上的 CPython 2.7 和 3.2 以及 Linux 上的 2.6 和 2.7 的各种版本…

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

多线程 Python 中的信号处理 的相关文章

  • 如何确定非阻塞套接字是否真正连接?

    这个问题不仅限于Python 这是一个一般的套接字问题 我有一个非阻塞套接字 想要连接到一台可访问的机器 在另一端 该端口不存在 为什么 select 仍然成功 我预计会超时 sock send 因管道损坏而失败 select 之后如何确定
  • python - 是否可以扩展 xml-rpc 可以序列化的事物集?

    我看到几个问题询问如何发送numpy ndarray通过 xml rpc 调用 这不能开箱即用 因为正如 xml rpc 中所述docs https docs python org 2 library xmlrpclib html 有一组固
  • python 中分割字符串以获得一个值?

    需要帮助 假设我在名为 input 的变量中有一个字符串 Sam Person name kind input split 通过执行上述操作 我得到两个具有不同字符串 Sam 和 Person 的变量 有没有办法只获取第一个值 name S
  • 可以在 TensorFlow 中使用排名相关作为成本函数吗?

    我正在处理偶尔充满异常值的极其嘈杂的数据 因此我主要依靠相关性来衡量我的神经网络的准确性 是否可以明确使用诸如等级相关性 斯皮尔曼相关系数 之类的东西作为我的成本函数 到目前为止 我主要依赖 MSE 作为相关性的代理 我现在面临三个主要障碍
  • 定义函数后对其进行修饰?

    I think答案是否定的 但我似乎找不到明确的说法 我有以下情况 def decorated function function functools wraps function def my function print Hello s
  • matplotlib matshow 标签

    我一个月前开始使用 matplotlib 所以我仍在学习 我正在尝试用 matshow 制作热图 我的代码如下 data numpy array a reshape 4 4 cax ax matshow data interpolation
  • 如何在python中检索aws批处理参数值?

    流程 Dynamo DB gt Lambda gt 批处理 如果将角色 arn 插入动态数据库 它是从 lambda 事件中检索的 然后使用submit job角色 arn 的 API 被传递为 parameters role arn ar
  • “./somescript.sh”和“. ./somescript.sh”有什么区别

    今天我按照一些说明在 Linux 中安装软件 有一个需要首先运行的脚本 它设置一些环境变量 指令告诉我执行 setup sh 但是我执行时犯了一个错误 setup sh 所以环境没有设置 最后我注意到了这一点并继续进行 我想知道这两种调用脚
  • 获取列表中倒数第二个元素[重复]

    这个问题在这里已经有答案了 我可以通过以下方式获取列表的倒数第二个元素 gt gt gt lst a b c d e f gt gt gt print lst len lst 2 e 有没有比使用更好的方法print lst len lst
  • 如何使用Python的super()来更新父值?

    我对继承很陌生 之前所有关于继承和 Python 的 super 函数的讨论都有点超出我的理解 我当前使用以下代码来更新父对象的值 usr bin env python test py class Master object mydata
  • 如何列出 python PDB 中的当前行?

    在 perl 调试器中 如果重复列出离开当前行的代码段 可以通过输入命令返回到当前行 点 我无法使用 python PDB 模块找到任何类似的东西 如果我list如果我自己离开当前行并想再次查看它 似乎我必须记住当前正在执行的行号 对我来说
  • 无法截取宽度为 0 的屏幕截图

    我正在尝试截取 Bootstrap 模态内元素的屏幕截图 经过一番努力 我终于想出了这段代码 driver get https enlinea sunedu gob pe driver find element by xpath div c
  • 导入错误:没有名为 google.auth 的模块

    当我尝试导入时firebase admin in python 2 7我收到错误 导入错误 没有名为 google auth 的模块 这是Docker文件 https github com ammaratef45 Attendance bl
  • 为什么实现 __iter__ 的对象不被识别为可迭代的?

    假设您使用包装对象 class IterOrNotIter def init self self f open tmp toto txt def getattr self item try return self getattribute
  • Scipy 稀疏 Cumsum

    假设我有一个scipy sparse csr matrix代表下面的值 0 0 1 2 0 3 0 4 1 0 0 2 0 3 4 0 我想就地计算非零值的累积和 这会将数组更改为 0 0 1 3 0 6 0 10 1 0 0 3 0 6
  • Python组合目录中的所有csv文件并按日期时间排序

    我有 2 年的每日数据分成每月文件 我想将所有这些数据合并到一个按日期和时间排序的文件中 我正在使用的代码组合了所有文件 但不按顺序 我正在使用的代码 import pandas as pd import glob os import cs
  • 检查字符串是否只有字母和空格 - Python

    试图让 python 返回一个字符串仅包含字母和空格 string input Enter a string if all x isalpha and x isspace for x in string print Only alphabe
  • TypeError:无法使用抽象方法实例化抽象类 <...>

    这是我的代码 from abc import ABC from abc import abstractmethod class Mamifiero ABC docstring for Mamifiero def init self self
  • 在 Python 模块中使用 InstaLoader

    我正在尝试使用 Instaloader 下载与主题标签相关的照片以进行图像分析 我在GitHub存储库中找到了一个全面的方法 如何在终端中执行它 但是 我需要将脚本集成到Python笔记本中 这是脚本 instaloader no vide
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul

随机推荐

  • 我什么时候会使用 JQuery.Callbacks?

    我正在查看 jQuery 1 7 中添加的新内容 我发现它们现在有 jQuery Callbacks http api jquery com jQuery Callbacks http api jquery com jQuery Callb
  • 如何使用 JavaScript 求 1 到 N 之间所有数字的总和

    我正在尝试找到一种使用 JavaScript 计算 1 到 N 之间所有数字之和的方法 以下是我迄今为止尝试过的代码 但它似乎不起作用 function numberSum N var total 0 for var i 1 i lt N
  • 如何在 2012 年引用 SSIS 中的 dll?

    我正在尝试使用脚本组件向我的 SSIS 包 2012 添加 dll 引用 IntelliSense 正在为我工 作 编码时我没有看到错误 但是 我收到以下错误 无法加载文件或程序集 XYZ 版本 1 0 0 0 文化 中性 PublicKe
  • 使用 jQueryeach 获取图像高度

    我的页面上有一堆图像 我正在尝试使用 jQuery 来获取每个图像的高度并将其显示在图像之后 这是我的代码 document ready function thumb each function imageWidth thumb img a
  • 如何在 PostgreSQL 中从 Json 数组中获取元素

    我对此进行了很多搜索 但仍然无法回答 我正在使用 PostgreSQL 在下面的示例中 列名称为 sections 列类型为 json 我的专栏在数据库中如下所示 sections name section1 attributes attr
  • 如何处理 Django Admin 中的大量删除?

    我正在使用 Django 2 2 10 我有一个模型叫Site 以及一个名为Record 每条记录都与一个站点 外键 相关联 我的应用程序运行几天 几周 几个月后 每个站点都可以有数千条与之关联的记录 我有效地使用数据库 所以这通常不是问题
  • 如何根据标题选择 TabItem

    在我的程序中我有一个tabItem当 a 时被选择TreeViewItem与同等的header被选中 这就是我目前拥有的 它有效 parent TreeViewItem Items Contains SelectedItem tabCont
  • 如果异步服务器 socket.BeginAccept() 为分配新端口的每个客户端套接字启动一个新线程,我的客户端套接字如何知道该端口?

    我正在阅读这个微软异步服务器服务器套接字示例 Bind the listener socket object to the local endpoint and listen for incoming connections try lis
  • jQuery.ajax() - IE9 中返回未定义的数据

    我有一个非常简单的代码 ajax cache false dataType html complete function jqXHR console log jqXHR responseText success function data
  • 在 docker 容器中挂载带有符号链接的主机目录

    我使用以下参数安装了容器 v home test home test 在主机的 home test 内部有一个指向 mnt 文件夹的符号链接 但是该链接虽然可以看到指向的位置 但在容器内似乎已损坏 root f93f72b45013 var
  • 动态表列

    当我想从仅包含字符串的列表列表 例如来自 csv 的数据 生成表格时 我应该如何进行 列的名称并不重要 从提供的所有示例中 我只看到将表项绑定到特定模型 这不适合那里 因为我有未知的列数和名称 如果您已经知道列名称和数据类型 我建议对其进行
  • 使用带有 IN 子句的 query() 进行 CodeIgniter 数据库查询

    我的模型中有以下代码 sql SELECT t1 t2 FROM Table1 t1 INNER JOIN Table2 t2 ON t1 id t2 id AND t2 title IN AND t1 type ORDER BY t1 i
  • 将现有数据库与 ASP.NET 5 和 EF7(测试版 7)结合使用

    我正在尝试使用 ASP NET 和 EF 7 beta 7 的空模板项目连接到现有数据库 这是我的 project json 的样子 webroot wwwroot userSecretsId aspnet5 Titanes2015 409
  • 如何在 JTextArea 中设置文本格式

    我正在尝试输出多行文本来创建 ASCII 艺术 但是当我使用 JFrame 和 JTextArea 时 它无法正确排列 我正在尝试打印ASCII 艺术圣诞快乐 https i stack imgur com WSsLh png但是当我在新窗
  • 如何通过redirect()传递验证错误数据?

    我有一个包含表单的页面 当任何用户提交它时 数据都会发送到控制器 控制器检查验证 如果有任何错误 它将用户重定向到上一页 包含表单的页面 否则它将数据发送到模型 要从控制器重定向到上一页 如果有任何验证错误 我有以下代码 redirect
  • 调整缩放 Gmaps4Rails

    我正在使用 Gmaps4Rails gem 无法弄清楚如何调整默认缩放设置 在我看来 我有以下代码 我知道这个问题已经被问过并回答过很多次了 但也许我只是没有看到一些东西 有什么建议吗 我错过了一些完全明显的东西吗 我很抱歉重新发布这个问题
  • 为什么 UriInfo.getQueryParameters() 不解码“+”?

    我知道我可以解决这个问题 但是与从参数映射中提取参数 应该根据 javadoc 进行解码 相比 如果使用带注释的查询参数 行为会有所不同 这似乎很奇怪 这是一个错误 还是只是一个怪癖 GET Path Produces MediaType
  • .htaccess 从 GET 变量重定向到 url 字符串

    我需要重定向 search keywords somesearchterm to search somesearchterm 这看起来非常基本 但我已经为此绞尽脑汁一个小时了 感谢您花时间查看此内容 您想使用 mod rewrite 实现所
  • (ROSE 绘图错误)错误:分面变量必须至少有一个值

    我正在尝试使用下面的代码在 R 中绘制每月玫瑰图 但遇到错误 错误 分面变量必须至少有一个值 这是我正在使用的数据 链接到数据 https www dropbox com s spwpoukrli5p715 test csv dl 0 这段
  • 多线程 Python 中的信号处理

    这应该非常简单 我很惊讶我在 stackoverflow 上找不到这个问题的答案 我有一个类似守护程序的程序 需要响应 SIGTERM 和 SIGINT 信号才能与 upstart 良好地配合 我读到 执行此操作的最佳方法是在与主线程不同的