- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要对 python 中的信号处理程序进行一些说明,因为我并不完全了解它们的工作原理、如何使用它们以及有哪些限制。
我打算在 linux 上使用 USR 信号,以便与作为服务在后台运行的 python 程序进行通信。
我发现,正如预期的那样,我发送的信号似乎以异步方式立即得到处理。
因此,我曾经认为注册的信号处理程序在它们自己的线程中运行,我认为这可以解释为什么下面的代码会一次打印多行 Signal handler called with signal 10
在循环中发送信号时
#!/usr/bin/python3.5
# This is the file signal_example.py
import signal, time, os
def handler(signum, frame):
print('Signal handler called with signal', signum)
time.sleep(20)
signal.signal(signal.SIGUSR1, handler)
time.sleep(100)
#!/usr/bin/bash
for ((i=0;i<100;i=i+1)); do
killall -s SIGUSR1 signal_example.py;
done
但是,文档指出 (https://docs.python.org/3.4/library/signal.html)“Python 信号处理程序始终在主 Python 线程中执行,即使信号是在另一个线程中接收到的也是如此。”。此外,对于上述示例,我没有看到在我的系统上运行单独的线程。
我现在想知道,我使用信号的方法的实际含义和限制是什么,以及我如何才能正确地做相关的事情,例如被调用的信号处理程序的实例之间的通信。
例如,在某些情况下,我希望能够延迟信号处理程序中某些代码的执行,直到处理完之前的同类信号为止。我也不明白有多少信号将被“并行”处理,以及当“队列”已满时会发生什么......
我一直在研究 Pyhton 的 asyncio
,它似乎提供了对异步代码的一些控制,并且还提供了自己的方式来注册信号处理程序。它似乎提供了一些帮助,但是,它似乎对我帮助不大,因为我看到的行为(信号在收到时几乎被处理)实际上是我想要的。我看到的 asyncio
信号处理程序的使用似乎是在事件循环中执行信号。在我开始使用的部分阻塞代码中,这可能为时已晚。我可以在单独的线程中运行其中的一些(使用相应的 asyncio
函数),但不能使整个代码成为非阻塞的。
最佳答案
I intend to use USR signals on linux in order to communicate with a python program running in the background as a service.
这听起来真是个坏主意。以下是几个原因:
Unix 信号是异步传递的,这意味着您可以在任何库代码运行时获取信号,例如在调用 malloc
的过程中。因此,只有少数函数是 async-signal-safe ,即可以安全地从信号处理程序调用。 Python 代码根本无法在信号处理程序内部执行,因此 signal.signal
设置的处理程序不会执行 Python 函数,而只是设置一个全局标志。这个标志由执行 Python 处理函数的主线程不时检查。这意味着无法保证信号会立即传送,即您不能依赖操作系统提供的信号传送保证。
信号可能会在前一个信号的处理程序执行期间到达。这就是为什么您看到多行被打印出来的原因,这是信号处理程序本身被信号中断并重新进入的结果。
除非您使用专门的 POSIX 调用设置信号处理程序(并且使用这些调用设置的处理程序不能直接执行 Python 代码),否则信号不会排队。即使在排队时,除了非实时信号外,生成和传递之间的信号顺序也不会保留。
信号与多线程代码的交互非常糟糕,即使在纯 C 中也是如此。
如果您有一个需要与之通信的服务,您可以有一个从命名管道读取或在套接字上监听的线程。写入管道或打开套接字将作为进程的信号。这也允许将附加信息传递给服务。
关于Python 和信号处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52291768/
我只是在 Mac OS X 中玩信号。 为什么在我的信号处理程序完成后,以下代码不会产生 SIGSEGV 的默认行为?在 Linux 下,代码运行良好。 #include #include #in
信号是由操作系统传给进程的中断,会提早终止一个程序。在 UNIX、LINUX、Mac OS X 或 Windows 系统上,可以通过按 Ctrl+C 产生中断。 有些信号不能被程序捕获,但是下表所
C、C++ 程序中,信号常常作为进程间通信的一种重要手段。举个例子: #include <stdio.h> #include <unistd.h> #include <
是否有关于重叠处理的任何好的(如果可能的话)科学资源(网络或书籍)。我对分析信号时使用重叠处理和窗口的效果不感兴趣,因为要求是不同的。有关以下实时情况的更多信息:(我当前正在处理音频信号) 将信号分成
在下面的代码中: #include #include #include #include #include using namespace std; void signal_callback_
我是操作系统的新手,在学习 Linux 信号处理时遇到了一些问题。 在 Linux 中,如果信号在系统调用期间到达,例如 pause(),程序将切换到内核模式并运行信号处理程序。然后根据处理函数,程序
我正在尝试在 shell 中实现一个简单的两级管道。 当我不做第二个 fork 而只是在父级中执行管道的其余实现时,它工作正常但我退出了 shell。这就是为什么我想做第二个 fork,这样我就不会退
我写了一个小脚本,用 Python 做了一些非常耗时的事情,我包含了一个信号处理模块,用于监听 SIGINT、SIGQUIT 和 SIGINFO,当用户输入 SIGQUIT 或 SIGINFO 时打印
我有一个正在读取的传感器,目前代码是用 Java 编写的,但我认为问题不是特定于语言的,更多的是与方法相关。 传感器会产生具有高脉冲和低脉冲的信号,大致类似于心跳。然而,“高”脉冲并不总是相同的电平,
使用mpirun时,是否可以在运行的代码中捕获信号(例如,^C生成的SIGINT)? 例如,我正在运行并行化的 Python 代码。在单独运行 python blah.py 时,我可以 except
如果 linux 进程正在等待 I/O(即它处于 SLEEP 状态)并且针对它发出 SIGKILL 信号,则在终止时( STOPPED 状态)是否会通过RUNNING 或READY 状态? 换句话说,
当进程正在执行阻塞系统调用时,比如读或写,信号已经到达。系统调用是否因错误 EINTR 而终止?处理系统调用后是否重启系统调用? 假设系统调用因错误 EINTR 终止,内核在返回用户空间之前处理该信号
有人可以解释为什么我们不应该从信号处理程序调用非异步函数吗?就像调用此类函数时破坏程序的确切步骤顺序一样。而且,信号是否总是在单独的堆栈上运行?如果是这样,它是一个单独的上下文还是在信号线程的上下文中
我在处理多线程服务器中的信号处理时遇到了麻烦。我为每个连接创建一个线程,但我希望有一个选项可以使用 SIGINT 终止服务器。但是,当其中一个线程捕获到信号时,事情会变得很糟糕。除了主线程之外,有什么
我写了一个扭曲的程序来处理来自 TCP 套接字和原始套接字的请求。由于 twisted 不支持原始线程,我在名为“raw_socket_loop”的函数中编写了原始套接字选择轮询循环。主 react
这个问题在这里已经有了答案: c: catch a segfault in exec() which was run in a child process (1 个回答) 关闭 6 年前。 我有一个
我有一个 repeat python 函数和一个只有一个按钮的 test.ui。我的疑问是每次单击按钮时如何准确地循环一次相同的功能。因为对我来说,每当我表演时: self.pushButton.cl
我想禁用像 SIGINT 这样的信号,它是通过按 CTRL_C 发送的,还有其他将终止 JVM 的信号。我在此处阅读了有关-Xrs 选项的信息 http://docs.oracle.com/javas
这个问题在这里已经有了答案: Getting fault address that generated a UNIX signal (2 个答案) 关闭 5 年前。 有没有办法找出被某些信号中断的机
是否可以通过 Erlang 中的处理程序捕获 Linux 信号(例如 SIGUSR1)? (无需求助于用 C 编写的驱动程序) 最佳答案 (不是真正的答案) 2001 年有人问: Does anyon
我是一名优秀的程序员,十分优秀!