采用interface实现的限时调用方法-博文

在实时性要求高的工程项目中,对于方法执行的时间有较高的要求,本示例程序,实现了一种安全的传入任意参数的方法限时调用工具类,能执行方法的最大容忍运行时间,保证服务不超时。

//@description 超时运行方法,限制方法的运行时间

// 需要实现抽象接口AppRuning的Run方法

// 调用时TimeOutRun(timeout, fun, args...)

// timeout超时时间(ms),fun实现Run()的回调方法,args...为方法调用参数列表

//@author chenbintao

//@data 2017-03-20 19:00 初稿

// 2017-03-20 19:30 调试通过

package main

import (

"log"

"runtime/debug"

"time"

)

const (

TIME_OUT_RUN_OK int = 1 //运行完成

TIME_OUT_RUN_OUT int = 0 //超时退出

)

var (

_TIME_OUT_RUN_DEBUG = false

)

func SetDebug(debug_mode bool) {

//设置调试模式:true调试模式

_TIME_OUT_RUN_DEBUG = debug_mode

return

}

func TimeOutRunApp(timeout uint64, callback func(v ...interface{}), v ...interface{}) {

var single chan int = make(chan int, 1)

//开启线程运行(参数必须采用v...,这样才是全参数传递,否则会出现[]interface{}问题)

go timeOutRunApp(single, safeFunction(callback), v...)

//阻塞等待运行结果或超时

select {

case <-single:

//运行完成退出

if _TIME_OUT_RUN_DEBUG {

log.Println("run ok!")

}

close(single)

return

case <-time.After(time.Millisecond /*ms*/ * time.Duration(timeout)):

//超时退出

if _TIME_OUT_RUN_DEBUG {

log.Println("run timeout!")

}

close(single)

return

}

}

func timeOutRunApp(single chan int, callback func(v ...interface{}), v ...interface{}) {

//调用执行回调方法,执行完成后,写入chan

callback(v...)

single <- TIME_OUT_RUN_OK

return

}

func safeFunction(fn func(v ...interface{})) func(v ...interface{}) {

//闭包方法安全运行

return func(v ...interface{}) {

defer func() {

if e, ok := recover().(error); ok {

log.Println("WARN: panic in %v - %v", fn, e)

log.Println(string(debug.Stack()))

}

}()

fn(v...)

}

}

//=================测试样例

func Run(v ...interface{}) {

//用于变量类型转换

var convert interface{}

//第一个参数

convert = v[0]

var args0 string = convert.(string)

//第二个参数

convert = v[1]

var args1 string = convert.(string)

//循环执行,flag=false:演示超时的情况,flag=true:演示非超时的情况

var count uint32

var flag bool = false

for {

time.Sleep(time.Millisecond * 1000)

log.Println(args0, args1, count)

count++

if flag {

return

}

}

return

}

func main() {

//设置调用超时5s,传入回调方法类App,及相关参数

TimeOutRunApp(5000, Run, "利用interface实现超时执行某方法:", "count=")

}

运行可参见http://studygolang.com/topics/2569

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2017-05-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码匠的流水账

聊聊hikari连接池的idleTimeout及minimumIdle属性

本文主要研究一个hikari连接池的idleTimeout及minimumIdle属性

39310
来自专栏Spring相关

oauth2.0实现sso单点登录的方式和相关代码

百科:SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的...

65120
来自专栏coder修行路

Go 源码学习之--net/http

其实自己不是很会看源码,但是学习优秀的源码是提升自己代码能力的一种方式,也可以对自己以后写代码有一个很好的影响,所以决定在之后的时间内,要有一个很好的习惯,阅读...

78550
来自专栏小樱的经验随笔

一文让你完全弄懂Stegosaurus

国内关于 Stegosaurus 的介绍少之又少,一般只是单纯的工具使用的讲解之类的,并且本人在学习过程中也是遇到了很多的问题,基于此种情况下写下此文,也是为我...

11220
来自专栏Golang语言社区

采用interface实现的限时调用方法-博文

在实时性要求高的工程项目中,对于方法执行的时间有较高的要求,本示例程序,实现了一种安全的传入任意参数的方法限时调用工具类,能执行方法的最大容忍运行时间,保证服务...

35680
来自专栏Android 研究

Android Handler机制11之Handler机制总结

经过上面的思考,大家是不是发现和其实我们Handler的机制基本上一致。Looper负责轮询;Message代表消息,为了区别对待,用what来做为标识符,wh...

1.3K10
来自专栏james大数据架构

MVC中局部视图的使用

加载部分视图 $("#result").load("/home/message",function(){ //加载完之后隐藏进度条 });  public Ac...

21270
来自专栏Java面试通关手册

面试必备之深入理解自旋锁

分享一个我自己总结的Java学习的系统知识点以及面试问题,目前已经开源,会一直完善下去,欢迎建议和指导欢迎Star: https://github.com/Sn...

66130
来自专栏大内老A

[WCF的Binding模型]之三:信道监听器(Channel Listener)

信道管理器是信道的创建者,一般来说信道栈的中每个信道对应着一个信道管理器。基于不同的消息处理的功能,将我们需要将相应的信道按照一定的顺序能组织起来构成一个信道栈...

21050
来自专栏SDNLAB

源码解读ODL的MAC地址学习(二)

1 简介 上一篇文章(源码解读ODL的MAC地址学习(一))已经分析了MAC地址学习中的ARP请求的部分源码,下面将接着上一篇文章,介绍一下ARP响应和生成流表...

44250

扫码关注云+社区

领取腾讯云代金券