Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在0.5秒后在python 2.4中发出警报信号

如何在0.5秒后在python 2.4中发出警报信号
EN

Stack Overflow用户
提问于 2011-11-23 12:52:47
回答 2查看 5.7K关注 0票数 8

我想在运行0.5秒后让一段特定的python代码超时。因此,我打算在0.5秒后引发一个异常/信号,并优雅地处理它,然后继续其余的代码。

在python中,我知道signal.alarm()可以设置整秒的闹钟。有没有其他方法可以在0.5秒后发出警报。在其他帖子中建议的signal.setitimer()在python2.4中不可用,为此我需要使用python2.4?

EN

回答 2

Stack Overflow用户

发布于 2011-11-23 20:39:05

从耐心等待的“守护进程”线程发出警报。在下面的代码中,snoozealarm通过SnoozeAlarm线程执行您想要的操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#! /usr/bin/env python

import os
import signal
import threading
import time

class SnoozeAlarm(threading.Thread):
  def __init__(self, zzz):
    threading.Thread.__init__(self)
    self.setDaemon(True)
    self.zzz = zzz

  def run(self):
    time.sleep(self.zzz)
    os.kill(os.getpid(), signal.SIGALRM)

def snoozealarm(i):
  SnoozeAlarm(i).start()

def main():
  snoozealarm(0.5)
  while True:
    time.sleep(0.05)
    print time.time()


if __name__ == '__main__':
  main()
票数 5
EN

Stack Overflow用户

发布于 2011-11-23 13:18:12

您有两个选择:

当有问题的代码运行时,

  1. Polling time.time()或类似程序。
  2. 正如pajton提到的,你可以写一个C扩展来调用系统调用setitimer()。这并不太难,因为您可以简单地从更高版本的signal.getitimer()的源代码中复制Python和signal.setitimer()的代码。它们只是对相同名称的系统调用的简单包装。

只有当您使用CPython并且您所处的环境允许您使用自定义C扩展时,此选项才是可行的。

Python:这是从signalmodule.c in Python 2.7复制的代码(适用许可):

#include "Python.h“#include静态计时器*ItimerError;/*辅助函数setitimer/getitimer */ static void timeval_from_double(double d,struct timeval *tv) { tv->tv_sec = floor(d);tv->tv_sec = fmod(d,1.0) * 1000000.0;}Py_LOCAL_INLINE(Double_from_timeval) double_from_timeval(struct timeval *tv) { return tv->tv_sec+ (double)(tv->tv_usec / 1000000.0);} PyObject * itimer_retval(struct itimerval *iv) { PyObject *r,*v;r= PyTuple_New(2);if (r == NULL)返回NULL;if(!(v = PyFloat_FromDouble(double_from_timeval(&iv->it_value)))) { Py_DECREF(r);return NULL;} PyTuple_SET_ITEM(r,0,v);如果(!(v= PyFloat_FromDouble(double_from_timeval(&iv->it_interval)))) { Py_DECREF(r);return NULL;} PyTuple_SET_ITEM(r,1,v);return r;} static PyObject * itimer_setitimer(PyObject *self,PyObject *args) { double first;double interval = 0;int which;struct itimerval new,old;if(!PyArg_ParseTuple(args,"id|d:setitimer",&which,&first,&interval)) return NULL;timeval_from_double(first,&new.it_value);timeval_from_double(interval,&new.it_interval);/*让操作系统检查"which“值*/ if (setitimer(which,&new,&old) != 0) { PyErr_SetFromErrno(ItimerError);return NULL;} return itimer_retval(& old );} PyDoc_STRVAR(setitimer_doc,“setitimer( that,seconds,interval)\n\ \n\设置给定的计时器(ITIMER_REAL、ITIMER_VIRTUAL\n\或ITIMER_PROF之一)在值为秒后触发,\n\每隔几秒后触发。\n\可以通过将秒设置为零来清除计时器。\n\\n\以元组形式返回旧值:( ITIMER_REAL,interval )。”);static PyObject * itimer_getitimer(PyObject *self,PyObject *args) { int;struct itimerval old;if (!PyArg_ParseTuple(args,"i:getitimer",&which)) return NULL;if (getitimer(which,&old) != 0) { PyErr_SetFromErrno(ItimerError);return NULL;} return itimer_retval(&old);} PyDoc_STRVAR(getitimer_doc,"getitimer(which)\n\ \n\返回给定定时器的当前值。“);static PyMethodDef itimer_methods[] ={ {"setitimer",itimer_setitimer,METH_VARARGS,setitimer_doc},{"getitimer",itimer_getitimer,METH_VARARGS,getitimer_doc},{NULL,NULL} /*标记*/ };PyMODINIT_FUNC初始化(空){ PyObject *m,*d,*x;int i;m= Py_InitModule3("itimer",itimer_methods,0);if (m == NULL) return;d= PyModule_GetDict(m);#ifdef ITIMER_REAL x= PyLong_FromLong(ITIMER_REAL);PyDict_SetItemString(d,"ITIMER_REAL",x);Py_DECREF(x);#endif #ifdef ITIMER_VIRTUAL x= PyLong_FromLong(ITIMER_VIRTUAL);PyDict_SetItemString(d,"ITIMER_VIRTUAL",x);Py_DECREF(x);#endif #ifdef ITIMER_PROF x= PyLong_FromLong(ITIMER_PROF);PyDict_SetItemString(d,"ITIMER_PROF",x);Py_DECREF(x);#endif ItimerError = PyErr_NewException("itimer.ItimerError",PyExc_IOError,NULL);if (ItimerError != NULL) PyDict_SetItemString(d,"ItimerError",ItimerError);}

将这段代码另存为itimermodule.c,使用如下命令将其编译为C扩展

gcc -I /usr/include/python2.4 2.4 -fPIC -o itimermodule.o -c itimermodule.c gcc -shared -o itimer.so itimermodule.o -lpython2.4

现在,如果您足够幸运,您应该能够使用以下命令从Python导入此文件

导入itimer

并调用itimer.setitimer().

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8242503

复制
相关文章
利用python发出rs232信号
最近接的一个项目涉及到用PC机的usb口收发rs232信号。为此,我写了一个简单的python程序,向usb口发送信号,然后通过一个usb转232线缆将信号转为rs232的。最后用万用表检查rs232端有无输出。
py3study
2020/01/10
2.4K0
利用python发出rs232信号
如何在Python中创建天气警报系统
通过阅读这篇文章,你将学会用Python创建一个天气警报系统,当它预测未来几小时内天空将下雨/下雪时,它会向多个收件人发送一封电子邮件通知。电子邮件通知包含其他信息,如预测的温度和湿度。
HuangWeiAI
2020/12/18
2.6K0
TF Analytics指南丨“分析”哪些内容?如何发出“警报”?
Tungsten Fabric是一个由计算节点、控制节点、配置节点、数据库节点、Web UI节点和分析节点组成的分布式系统。
Tungsten Fabric
2021/01/14
1.3K0
TF Analytics指南丨“分析”哪些内容?如何发出“警报”?
微软发出Word漏洞警报,网民防范带毒文档
如果最近有用户收到RTF格式的Word文档,一定不要轻易打开。根据微软的紧急安全公告显示,Word所有版本均存在一个高危漏洞,并已被黑客攻击,Windows和Mac用户都受漏洞影响。 利用Word漏洞,黑客可以在RTF文件中植入恶意代码,从而在用户打开文件时植入任意木马病毒。办公软件漏洞对企事业单位危害更大,黑客会精心制作文档标题,利用邮件等方式诱骗企事业办公人员点击,从而渗透到内网中窃取重要资料。 值得警惕的是,由于微软Outlook 2007/2010/2
安恒信息
2018/04/10
6960
Python 在信号处理中的优势
本篇是对Pylab的小试牛刀,也是对许多其他主题的过渡——包括《编码速度估计的长时间等待的后果》。
用户3412318
2019/01/02
2.8K0
如何在Ubuntu 16.04上使用Alerta监视Zabbix警报
Alerta是一个Web应用程序,用于合并和删除来自多个监视系统的警报,并在界面上显示它们。Alerta可以与许多的监控工具集成,如Nagios,Zabbix,Sensu,InfluxData Kapacitor等等。
不会飞的蝴蝶
2018/08/13
4.2K0
[可视化]盘旋光束如幽灵的Wi-Fi信号图
英国大学生绘制Wi-Fi信号图,盘旋光束如幽灵。 据英国《每日邮报》6月19日报道,英国纽卡斯尔大学博士生路易斯·赫南(Luis Hernan)日前绘制出一系列展现人类周围无形网络Wi-Fi连接情况的
大数据文摘
2018/05/21
1K0
Prometheus:警报
1、alertmanager.yml文件 global: resolve_timeout: 5m smtp_smarthost: 'smtp.163.com' smtp_from: '13285921108@163.com' smtp_auth_username: '13285921108@163.com' smtp_auth_password: 'xxxxxxxxxx' wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
用户5760343
2020/01/15
5840
[翻译] Python 在信号处理中的优势之二
还有,诸如SPTool(用于一般信号可视化和过滤)或FDATool(用于数字滤波器设计)的GUI工具用于高质量的专业级信号处理和控制系统设计。
用户3412318
2019/01/09
1.9K0
如何在原生Node.js中发出HTTP请求
本文翻译自How to make HTTP Requests in native Node.js
ccf19881030
2020/10/29
4.5K0
引入信号后的几种陷阱讲解
程序在引入信号机制后会变的非常多元化,程序在某些情况下难以理解并且会出现一些非常奇特的问题,但这些问题经过总结无非是因为使用了不可重入函数、信号引起的时序竞态、信号处理函数与主程序的异步io过程中出现的问题。要避免这些问题,我们要先来复现和分析这些情况是如何出现的,才能针对性的去解决这些问题。
我与梦想有个约会
2023/10/20
2110
引入信号后的几种陷阱讲解
Jmeter中发出请求后的接收的response data乱码
搜索“sampleresult.default.encoding” 设置sampleresult.default.encoding=UTF-8如图(ISO-8859-1为默认编码):
JavaEdge
2021/02/23
3560
Jmeter中发出请求后的接收的response data乱码
在 Vue 中,如何从插槽中发出数据
代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug。
前端小智@大迁世界
2020/08/11
3K0
信号与系统实验一 信号在MATLAB中的表示
 3.用下列函数各画一图,参数自定。 sinc,rectpuls,square,tripuls,sawtooth
timerring
2022/07/20
1.3K0
信号与系统实验一 信号在MATLAB中的表示
电脑警报声
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/167951.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/20
5950
在 Docker 容器中捕获信号
我们可能都使用过 docker stop 命令来停止正在运行的容器,有时可能会使用 docker kill 命令强行关闭容器或者把某个信号传递给容器中的进程。这些操作的本质都是通过从主机向容器发送信号实现主机与容器中程序的交互。比如我们可以向容器中的应用发送一个重新加载信号,容器中的应用程序在接到信号后执行相应的处理程序完成重新加载配置文件的任务。本文将介绍在 docker 容器中捕获信号的基本知识。
星哥玩云
2022/07/19
2.7K0
在 Docker 容器中捕获信号
trap - 在脚本中处理信号
  比如,按Ctrl+C会使脚本终止执行,实际上系统发送了SIGINT信号给脚本进程,SIGINT信号的默认处理方式就是退出程序。如果要在Ctrl+C不退出程序,那么就得使用trap命令来指定一下SIGINT的处理方式了。
yaohong
2019/09/11
1.6K0
如何在Python中使用静态变量在计数
今天,在用Python写一个统计一个文件下有多少文件的小标本时,遇到了一个很棘手的问题。如何在Python中使用静态变量来计数。然后,就在网上一通查找,找的方法都是利用类的方法来实现静态变量。说实话没有看太懂,另外我想如果用类成员当做静态变量来计数是不是很麻烦,我们还要编写ADD()函数,来实现加1操作(因为要计数吗?)。其实,主要原因还是没有看懂如何用类成员的方式实现静态变量,因此,我放弃了这种方法。
py3study
2020/01/08
1.7K0
让vscode在远程连接服务器时候如本地般顺滑地debug(Python)
【GaintPandaCV导读】本文主要分享了python语言的使用vscode在远程连接服务器的debug,可以通过launch.json来传入python脚本的参数,这样就能够在该情况下用vscode调试,操作跟vscode在本地调试一样
BBuf
2021/07/01
13.2K0
让vscode在远程连接服务器时候如本地般顺滑地debug(Python)
点击加载更多

相似问题

如何在Python中发出信号?

20

领事-如驾驶已满,应发出警报。

43

如何在多次单击后发出警报

11

在负载懒惰后发出警报

311

如何在Python上发出简单的警报

85
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文