新聞中心
如何在 Golang 定時(shí)任務(wù)中判斷函數(shù)是否執(zhí)行完成
一般都是通過(guò)日志打印
專業(yè)領(lǐng)域包括成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、成都商城網(wǎng)站開(kāi)發(fā)、微信營(yíng)銷、系統(tǒng)平臺(tái)開(kāi)發(fā), 與其他網(wǎng)站設(shè)計(jì)及系統(tǒng)開(kāi)發(fā)公司不同,創(chuàng)新互聯(lián)的整合解決方案結(jié)合了幫做網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗(yàn)和互聯(lián)網(wǎng)整合營(yíng)銷的理念,并將策略和執(zhí)行緊密結(jié)合,為客戶提供全網(wǎng)互聯(lián)網(wǎng)整合方案。
譬如run方法里面加入以下
log.info("定時(shí)器啟動(dòng),時(shí)間:"+new Date())
try{
}catch(){
log.error("出現(xiàn)異常")
return;
}
log.info("定時(shí)器結(jié)束,時(shí)間:"+new Date())
當(dāng)日志打印有結(jié)束語(yǔ)句就證明跑完了
Golang time.Time.Add()用法及代碼示例
在Go語(yǔ)言中,時(shí)間包提供了確定和查看時(shí)間的函數(shù)。 Go語(yǔ)言中的Time.Add()函數(shù)用于添加規(guī)定的時(shí)間和持續(xù)時(shí)間。此外,此函數(shù)在時(shí)間包下定義。在這里,您需要導(dǎo)入“time”包才能使用這些函數(shù)。
用法:
在此,“t”是規(guī)定的時(shí)間,“d”是要添加到規(guī)定時(shí)間的持續(xù)時(shí)間。
返回值: 它返回將指定的t和d相加的結(jié)果。
例:
輸出:
此處,返回的輸出采用上述UTC格式。
簡(jiǎn)單聊聊Golang中defer預(yù)計(jì)算參數(shù)
什么是defer
defer 可以保證方法可以在外圍函數(shù)返回之前調(diào)用。有點(diǎn)像其他言的 try finally
Go語(yǔ)言defer預(yù)計(jì)算參數(shù)
Go 語(yǔ)言中所有的函數(shù)調(diào)用都是傳值的,雖然 defer 是關(guān)鍵字,但是也繼承了這個(gè)特性。假設(shè)我們想要計(jì)算 main 函數(shù)運(yùn)行的時(shí)間,可能會(huì)寫出以下的代碼:
結(jié)果是:
運(yùn)行結(jié)果并不符合我們的預(yù)期,這個(gè)現(xiàn)象背后的原因是什么呢?經(jīng)過(guò)分析,我們會(huì)發(fā)現(xiàn)調(diào)用 defer 關(guān)鍵字會(huì)立刻拷貝函數(shù)中引用的外部參數(shù),所以 time.Since(startedAt) 的結(jié)果不是在 main 函數(shù)退出之前計(jì)算的,而是在 defer 關(guān)鍵字調(diào)用時(shí)計(jì)算的【defer入棧的時(shí)候】,最終導(dǎo)致上述代碼輸出 0s
我們?cè)賮?lái)看個(gè)簡(jiǎn)單例子來(lái)說(shuō)明上述解釋:
當(dāng)代碼運(yùn)行到defer fmt.Println(test(i))的時(shí)候,會(huì)把defer右邊最外層函數(shù)的參數(shù)計(jì)算完畢,并傳遞進(jìn)函數(shù)里,但不會(huì)執(zhí)行函數(shù)體的代碼直到包裹defer的函數(shù)返回。我們先看會(huì)把defer右邊最外層函數(shù)的參數(shù)計(jì)算完畢,并傳遞進(jìn)函數(shù)里這句話,對(duì)應(yīng)例子就是先把test(i)算出來(lái),此時(shí)i=1,計(jì)算test(1)得2,然后fmt.Println(2)入棧,等到最后程序運(yùn)行完了再運(yùn)行defer結(jié)果就是2(但不會(huì)執(zhí)行函數(shù)體的代碼直到包裹defer的函數(shù)返回)。
我們?cè)賮?lái)看一個(gè)例子與匿名函數(shù)結(jié)合:
結(jié)果:
使用匿名函數(shù),結(jié)果是101,相當(dāng)于i給到test方法的是100,那為什么呢?還是那句話:但不會(huì)執(zhí)行函數(shù)體的代碼直到包裹defer的函數(shù)返回
也就是說(shuō)他會(huì)把整個(gè){ fmt.Println(test(i)) }()函數(shù)體入棧,等到最后程序運(yùn)行完了再運(yùn)行defer,此時(shí)的i是100,運(yùn)行test后就是101了。
所以你要解決第一個(gè)打印為0s的問(wèn)題,你就可以使用匿名函數(shù)來(lái)解決,如下:
結(jié)果:
怎樣計(jì)算程序的執(zhí)行時(shí)間(C語(yǔ)言中)?
在c語(yǔ)言中有專門處理系統(tǒng)時(shí)間,程序計(jì)時(shí)等等功能的庫(kù),
即time.h
在time.h中函數(shù)clock_t clock( void )可以完成計(jì)時(shí)功能。
這個(gè)函數(shù)返回從“開(kāi)啟這個(gè)程序進(jìn)程”到“程序中調(diào)用clock()函數(shù)”時(shí)之間的CPU時(shí)鐘計(jì)時(shí)單元(clock tick)數(shù),在MSDN中稱之為掛鐘時(shí)間(wal-clock)。其中clock_t是用來(lái)保存時(shí)間的數(shù)據(jù)類型,在time.h文件中,我們可以找到對(duì)它的定義:
#ifndef _CLOCK_T_DEFINED
typedef long clock_t;
#define _CLOCK_T_DEFINED
#endif
很明顯,clock_t是一個(gè)長(zhǎng)整形數(shù)。在time.h文件中,還定義了一個(gè)常量CLOCKS_PER_SEC,它用來(lái)表示一秒鐘會(huì)有多少個(gè)時(shí)鐘計(jì)時(shí)單元,其定義如下:
#define CLOCKS_PER_SEC ((clock_t)1000)
可以看到每過(guò)千分之一秒(1毫秒),調(diào)用clock()函數(shù)返回的值就加1。
下面這個(gè)程序計(jì)算了循環(huán)1千萬(wàn)次所用的時(shí)間:
#include “stdio.h”
#include “stdlib.h”
#include “time.h”
int main( void )
{
long i = 10000000L;
clock_t start, finish;
double duration;
/* 測(cè)量一個(gè)事件持續(xù)的時(shí)間*/
printf( "Time to do %ld empty loops is ", i );
start = clock();
while( i-- ) ;
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "%f seconds\n", duration );
system("pause");
}
運(yùn)行結(jié)果如下:
Time to do 10000000 empty loops is 0.03000 seconds
參考資料:
如何計(jì)算函數(shù)調(diào)用時(shí)間
具體細(xì)節(jié)如下:
計(jì)算函數(shù)執(zhí)行時(shí)間是評(píng)價(jià)程序效率的一種常用方法。
可以在調(diào)用一個(gè)函數(shù)之間獲取當(dāng)前時(shí)間,在調(diào)用之后再次獲取當(dāng)前時(shí)間,然后計(jì)算二者的時(shí)間差。
但是如果一個(gè)函數(shù)執(zhí)行時(shí)間非常短,會(huì)得到兩個(gè)時(shí)間差為0的情況,此時(shí)可以修改程序?yàn)檎{(diào)用該函數(shù)1000次,然后把時(shí)間差除以1000。
得到當(dāng)前時(shí)間的方法是:首先程序最前面添加頭文件#includetime.h,然后通過(guò)調(diào)用time(NULL)獲取當(dāng)前時(shí)間。
分享題目:Go語(yǔ)言計(jì)算函數(shù)執(zhí)行時(shí)間 go語(yǔ)言函數(shù)定義
鏈接URL:http://fisionsoft.com.cn/article/hhehos.html