python发送信号
A. python 多线程与多进程问题
监控一个信号就起一个线程与进程处理。这样的逻辑是不太合适的。所有的资源都是有限的,如果这样浪费很快会资源管理失控。
常规的做法是起一个线程池,或者是进程池。 使用线程还是进程取决于你处理的信号的类型。如果计算量大,则需要进程池,如果只是设备等待,比如网络数据收发,则线程也勉强够用。
信号过来后处理方法有两种,一种是实时处理,这个没有好办法,可以用“微线程”的办法做,尽量减少处理周期。另外一种是允许少量的延迟。那么通常的做法是用队列。将信号放到线程或者是进程池的消息队列里。然后再由后者分配。
还有一种高效的处理方法,根据信号的值做hash,然后自动分发到不同的CPU或者是服务器。这个就算是大规模并发处理机制。
通常情况下,比如一个WEB服务器,它需要获取一个请求,然后处理响应,可以使用线程模型,或者是进程模型。也是使用典型的池的方法。一个Pool的大于,取决于你的计算 机的计算 能力,内存大小,以及你的并发访问数量。
所要要启用多少个呢?假设你的一个信号的处理周期是1秒,你同时有100个信号进来,那么就需要100个线程或者是进程。
线程数过多,表面上处理能力在增加,不过延迟也在增加,失败率也会增加。
B. processbuilder 发送信号
processbuilder发送信号需要Root权限。
kill进程号实现上是发了一个信号给指定的进程。在python里,也可以加载事件处理模块,处理来自其它程序发过来的信号,可以用KILL工具发信号。
C. 如何使用python处理心音信号
在了解了linux的信号基础之 后,Python标准库中的signal包就很容易学习和理解。signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂 停并等待信号,以及定时发出SIGALRM等。要注意,signal包主要是针对UNIX平台(比如Linux, MAC OS),而Windows内核中由于对信号机制的支持不充分,所以在Windows上的Python不能发挥信号系统的功能。
信号(signal)-- 进程之间通讯的方式,是一种软件中断。一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号。
定义信号名
signal包定义了各个信号名及其对应的整数,比如:
import signal
print(signal.SIGABRT)
print(signal.SIG_DFL)
Python所用的信号名与Linux一致,可以通过$ man 7 signal 查询
预设信号处理函数
signal包的核心是使用signal.signal()函数来预设(register)信号处理函数,如下所示:
singnal.signal(signalnum, handler)
signalnum为某个信号,handler为该信号的处理函数。我们在信号基础里提到,进程可以无视信号,可以采取默认操作,还可以自定义操作。当handler为signal.SIG_IGN时,信号被无视(ignore)。当handler为singal.SIG_DFL,进程采取默认操作(default)。当handler为一个函数名时,进程采取函数中定义的操作。
import signal
# Define signal handler function
def myHandler(signum, frame):
print('I received: ', signum)
# register signal.SIGTSTP's handler
signal.signal(signal.SIGTSTP, myHandler)
signal.pause()
print('End of Signal Demo')
# 有问题待测试
在主程序中,我们首先使用signal.signal()函数来预设信号处理函数。然后我们执行signal.pause()来让该进程暂停以等待信号, 以等待信号。当信号SIGUSR1被传递给该进程时,进程从暂停中恢复,并根据预设,执行SIGTSTP的信号处理函数myHandler()。 myHandler的两个参数一个用来识别信号(signum),另一个用来获得信号发生时,进程栈的状况(stack frame)。这两个参数都是由signal.singnal()函数来传递的。
上面的程序可以保存在一个文件中(比如test.py)。我们使用如下方法运行:
$python test.py
以便让进程运行。当程序运行到signal.pause()的时候,进程暂停并等待信号。此时,通过按下CTRL+Z向该进程发送SIGTSTP信号。我们可以看到,进程执行了myHandle()函数, 随后返回主程序,继续执行。(当然,也可以用$ps查询process ID, 再使用$kill来发出信号。)
(进程并不一定要使用signal.pause()暂停以等待信号,它也可以在进行工作中接受信号,比如将上面的signal.pause()改为一个需要长时间工作的循环。)
我们可以根据自己的需要更改myHandler()中的操作,以针对不同的信号实现个性化的处理。
定时发出SIGALRM信号
一个有用的函数是signal.alarm(),它被用于在一定时间之后,向进程自身发送SIGALRM信号:
import signal
# Define signal handler function
def myHandler(signum, frame):
print("Now, it's the time")
exit()
# register signal.SIGALRM's handler
signal.signal(signal.SIGALRM, myHandler)
signal.alarm(5)
while True:
print('not yet')
我们这里用了一个无限循环以便让进程持续运行。在signal.alarm()执行5秒之后,进程将向自己发出SIGALRM信号,随后,信号处理函数myHandler开始执行。
发送信号
signal包的核心是设置信号处理函数。除了signal.alarm()向自身发送信号之外,并没有其他发送信号的功能。但在os包中,有类似于linux的kill命令的函数,分别为
os.kill(pid, sid)
os.killpg(pgid, sid)
分别向进程和进程组(见Linux进程关系)发送信号。sid为信号所对应的整数或者singal.SIG*。
实际上signal, pause,kill和alarm都是Linux应用编程中常见的C库函数,在这里,我们只不过是用Python语言来实现了一下。实际上,Python 的解释器是使用C语言来编写的,所以有此相似性也并不意外。此外,在Python 3.4中,signal包被增强,信号阻塞等功能被加入到该包中。我们暂时不深入到该包中。
总结
signal.SIG*
signal.signal()
signal.pause()
signal.alarm()
D. 如何利用python dbus来发送一个信号
dbus用于进程间通信,可以降低不同程序间的耦合性,dbus的原理同分布式计算很象
用python来操作dbus很方便,
一些官方例子: 例子
简单过程
1.首先要从dbus.service.Object继承,这样才可以输出方法和信号,同时调用dbus.service.Object来初始化bus类型(Session bus or System bus),以及 对象路径
class Msg(dbus.service.Object):
def __init__(self,bus,object_path):
dbus.service.Object.__init__(self,bus,object_path)
2.输出信号,先修饰,信号要传递的参数有signature确定,然后再定义信号函数,信号函数体本身没多大意义,有意义的只在于函数体的参数,在dbus中的信号名就是这个信号函数的名字
@dbus.service.signal(dbus_interface=MSG_INTERFACE_URI,
signature='as') #发送了一个可变数组,但数组的类型要一致,这里都是string
def msg_signal(self,msg_list):
print "exported signal: ",msg_list #这个没有意义
3..定义一个发送信号的函数,注意要返回True,否则如果调用timeout_add的时候,它执行了一次就会停下来,不会重复执行,因为timeout_add碰到False的时候就会停止执行
发送信号,其实也就只是调用刚才修饰的信号函数而已
def construct_msg(self):
timeStamp = time.strftime(TIMEFORMAT)
self.msg_signal(["1111",timeStamp,"This is the content","1 2 3"])
return True
4.连接到bus,注意在连接前要先选好loop的类型,否则不让连接
DBusGMainLoop(set_as_default=True) #选好loop的类型
bus = dbus.SessionBus()
aMsg = Msg(bus,MSG_OBJ_PATH) #将对象输出到bus中
gobject.timeout_add(1000,aMsg.construct_msg) #定时发送信号,知道其中的函数返回False为止
loop = gobject.MainLoop()
loop.run()
E. python中子进程发送信号父进程怎么互发信号
ubuntu下,也就是linux下,通常会用kill -事件编号实现。 你查一下LINUX下的事件就明白了。 kill进程号 实现上是发了一个信号给指定的进程。 在python里,也可以加载事件处理模块,处理来自其它程序发过来的信号, 当然你可以用KILL工具发信号...
F. python pyqt5 qthread有哪些方法
用例子说明吧,常用的不多
PyQt中的线程类 QtCore.QThread ,使用时继承QThread类
启动界面的线程暂称为UI线程。界面执行命令时都在自己的UI线程中。
如果在UI线程中执行网络连接和数据库操作等耗时的操作,界面会被卡住,Windows下有可能会出现“无响应”的警告。
阻塞UI线程会降低用户体验和应用稳定性。因此我们可以把耗时操作放在线程中去执行。
QThread代表一个线程,我们可以复写run函数来执行我们要的操作。
QThread可以使用 QtCore.pyqtSignal 来与界面交互和传输数据。
PyQt4 QThread 代码示例
•Python2.7
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore
from PyQt4.QtCore import QCoreApplication
from PyQt4.QtGui import QWidget, QPushButton, QApplication, QTextBrowser
class TimeThread(QtCore.QThread):
signal_time = QtCore.pyqtSignal(str, int) # 信号
def __init__(self, parent=None):
super(TimeThread, self).__init__(parent)
self.working = True
self.num = 0
def start_timer(self):
self.num = 0
self.start()
def run(self):
while self.working:
print "Working", self.thread()
self.signal_time.emit("Running time:", self.num) # 发送信号
self.num += 1
self.sleep(1)
class TimeDialog(QWidget):
def __init__(self):
super(TimeDialog, self).__init__()
self.timer_tv = QTextBrowser(self)
self.init_ui()
self.timer_t = TimeThread()
self.timer_t.signal_time.connect(self.update_timer_tv)
def init_ui(self):
self.resize(300, 200)
self.setWindowTitle('TimeDialog')
self.timer_tv.setText("Wait")
self.timer_tv.setGeometry(QtCore.QRect(10, 145, 198, 26))
self.timer_tv.move(0, 15)
btn1 = QPushButton('Quit', self)
btn1.setToolTip('Click to quit')
btn1.resize(btn1.sizeHint())
btn1.move(200, 150)
btn1.clicked.connect(QCoreApplication.instance().quit)
start_btn = QPushButton('Start', self)
start_btn.setToolTip("Click to start")
start_btn.move(50, 150)
self.connect(start_btn, QtCore.SIGNAL("clicked()"), self.click_start_btn)
def click_start_btn(self):
self.timer_t.start_timer()
def update_timer_tv(self, text, number):
self.timer_tv.setText(self.tr(text + " " + str(number)))
if __name__ == '__main__':
app = QApplication(sys.argv)
time_dialog = TimeDialog()
time_dialog.show()
sys.exit(app.exec_())
QThread中使用的信号 signal_time = QtCore.pyqtSignal(str, int) 指定了参数str和int
发送信号 self.signal_time.emit("Running time:", self.num)
外部接收信号 self.timer_t.signal_time.connect(self.update_timer_tv)
信号连接到方法 update_timer_tv(self, text, number) ,注意信号与方法的参数要一一对应
使用中我们可以定义多种不同的信号 QtCore.pyqtSignal
启动线程,调用 start()
G. Python 数字信号处理程序实现求解
数字信号处理是把信号用数字或符号表示成序列,通过计算机或通用(专用)信号处理设备,用数值计算方法进行各种处理,达到提取有用信息便于应用的目的。例如:滤波、检测、变换、增强、估计、识别、参数提取、频谱分析等。
一般地讲,数字信号处理涉及三个步骤:
⑴模数转换(A/D转换):把模拟信号变成数字信号,是一个对自变量和幅值同时进行离散化的过程,基本的理论保证是采样定理。
⑵数字信号处理(DSP):包括变换域分析(如频域变换)、数字滤波、识别、合成等。
⑶数模转换(D/A转换):把经过处理的数字信号还原为模拟信号。通常,这一步并不是必须的。 作为DSP的成功例子有很多,如医用CT断层成像扫描仪的发明。它是利用生物体的各个部位对X射线吸收率不同的现象,并利用各个方向扫描的投影数据再构造出检测体剖面图的仪器。这种仪器中fft(快速傅里叶变换)起到了快速计算的作用。以后相继研制出的还有:采用正电子的CT机和基于核磁共振的CT机等仪器,它们为医学领域作出了很大的贡献。
信号处理的目的是:削弱信号中的多余内容;滤出混杂的噪声和干扰;或者将信号变换成容易处理、传输、分析与识别的形式,以便后续的其它处理。 下面的示意图说明了信号处理的概念。
H. qt与python之间怎么建立信号槽链接
(1)类中信号与槽连接
connect(ui->action_Open, SIGNAL(triggered()), this, SLOT(showOpenFileDlg()));11
(2)类之间槽的连接
//类间信号与槽连接,但是没有传递数据
geometryTransform* geomtry = new geometryTransform();//实例化类的对象
connect(ui->action_Scale, SIGNAL(triggered()), geomtry, SLOT(scale()));123123
//类间信号与槽连接,并且传递数据
imageEnhance* imgEnhance = = new imageEnhance();//实例化类的对象
//A->B->A,A 向B发送信号,B执行处理,处理结果再返回A显示,即操作与显示分开,更合理
connect(ui->action_MediumFilter, SIGNAL(triggered()), this, SLOT(sendQPixmap()));
connect(this,SIGNAL(getQPixmap(QString)), imgEnhance, SLOT(meanFilter(QString)));
connect(imgEnhance, SIGNAL(getQpixmap(QPixmap*)), this,SLOT(updateView(QPixmap*)))
I. pyqt python 信号简单问题
self.pushButton_Open_Data.clicked.connect(PF.initialized_Infomation.open_Folder)
J. python 怎么查看signal
信号(signal)--进程之间通讯的方式,是一种软件中断。一个进程一旦接受到信号就会打断原来的程序执行流程来处理信号。
几个常用信号:
SIGINT 终止进程 中断进程 (control+c)
SIGTERM 终止进程 软件终止信号
SIGKILL 终止进程 杀死进程
SIGALRM 闹钟信号
进程结束信号 SIGTERM和SIGKILL的区别
SIGTERM比较友好,进程能捕捉这个信号,根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。在某些情况下,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。
对于SIGKILL信号,进程是不能忽略的。这是一个 “我不管您在做什么,立刻停止”的信号。假如您发送SIGKILL信号给进程,Linux就将进程停止在那里。
发送信号一般有两种原因:
1(被动式) 内核检测到一个系统事件.例如子进程退出会像父进程发送SIGCHLD信号.键盘按下control+c会发送SIGINT信号
2(主动式) 通过系统调用kill来向指定进程发送信号
补充:
POSIX.1中列出的信号:
信号 值 处理动作 发出信号的原因
----------------------------------------------------------------------
SIGHUP 1 A 终端挂起或者控制进程终止
SIGINT 2 A 键盘中断(如break键被按下)
SIGQUIT 3 C 键盘的退出键被按下
SIGILL 4 C 非法指令
SIGABRT 6 C 由abort(3)发出的退出指令
SIGFPE 8 C 浮点异常
SIGKILL 9 AEF Kill信号
SIGSEGV 11 C 无效的内存引用
SIGPIPE 13 A 管道破裂: 写一个没有读端口的管道
SIGALRM 14 A 由alarm(2)发出的信号
SIGTERM 15 A 终止信号
SIGUSR1 30,10,16 A 用户自定义信号1
SIGUSR2 31,12,17 A 用户自定义信号2
SIGCHLD 20,17,18 B 子进程结束信号
SIGCONT 19,18,25 进程继续(曾被停止的进程)
SIGSTOP 17,19,23 DEF 终止进程
SIGTSTP 18,20,24 D 控制终端(tty)上按下停止键
SIGTTIN 21,21,26 D 后台进程企图从控制终端读
SIGTTOU 22,22,27 D 后台进程企图从控制终端写
处理动作一项中的字母含义如下:
A 缺省的动作是终止进程
B 缺省的动作是忽略此信号
C 缺省的动作是终止进程并进行内核映像转储(mp core)
D 缺省的动作是停止进程
E 信号不能被捕获
F 信号不能被忽略
键盘和shell的交互:
Ctrl-c Kill foreground process 常用 ;送SIGINT信号,默认进程会结束,但是进程自己可以重定义收到这个信号的行为。
Ctrl-z Suspend foreground process;送SIGSTOP信号,进程只是被停止,再送SIGCONT信号,进程继续运行。
Ctrl-d Terminate input, or exit shell 常用 有时也会使程序退出,例如没有参数的cat命令,从终端读一行显示一行,知道Ctrl+D终结输入并终结进程;不是发送信号,而是表示一个特殊的二进制值,表示 EOF。
Ctrl-s Suspend output
Ctrl-q Resume output
Ctrl-o Discard output
Ctrl-l Clear screen
控制字符都是可以用(stty命令)更改的。可以用stty -a看看终端配置。
有些信号不能被屏蔽,比如中断,还应该有杀死进程的信号,要不然内核怎么做操作系统中的老大。实际上,SIGKILL和SIGSTOP信号是不能被屏蔽或阻止的,他们的默认动作总是会被执行的