oracle每年执行一次函数,在若干协程中只执行一次函数

本文通过一个Go语言示例介绍了如何使用sync.Once确保某个函数仅被执行一次,避免多次初始化的问题。同时展示了如何在多个并发协程中正确地利用这一特性。

只执行一次初始化,注意协程的公共变量与私有变量。

点击(此处)折叠或打开

//sync_my project main.go

package main

import(

"fmt"

"sync"

"time"

)

func ExampleOnce() {

var once sync.Once

onceBody:=func() {

fmt.Println("Only once")

}

done:=make(chan bool)

fori:=0;i<10;i++ {

go func(jint) {

once.Do(onceBody)

done

fmt.Printf("routinei: %d put\n",i)

fmt.Printf("routinej: %d put\n",j)

}(i)

}

fori:=0;i<10;i++ {

fmt.Printf("main get %d\n",i)

}

//Output:

//Only once

}

func main() {

ExampleOnce()

time.Sleep(2)

}

结果输出:

Only once

routinei: 10 put

routinej: 9 put

main get 0

main get 1

main get 2

main get 3

main get 4

main get 5

main get 6

main get 7

main get 8

main get 9

routinei: 10 put

routinej: 4 put

routinei: 10 put

routinej: 6 put

routinei: 10 put

routinej: 1 put

routinei: 10 put

routinei: 10 put

routinej: 5 put

routinei: 10 put

routinej: 3 put

routinei: 10 put

routinej: 2 put

routinei: 10 put

routinej: 7 put

routinej: 0 put

routinei: 10 put

routinej: 8 put

成功: 进程退出代码 0.

---------------------------------------------------

注释:

1.函数onceBody只执行1次

2.为了确保所有协程都执行完,主线程才退出,在主线程最后休眠2秒。

3.i是公共变量,由于cpu操作比io快很多,所有最后i变成10了,语句fmt.Printf("routinei: %d put\n", i)才执行,所以协程输出i都是10。j是协程私有变量,输出传给各个协程的编号,各个协程互不影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值