等待一个函数在golang中执行完毕。

huangapple go评论105阅读模式
英文:

Wait for a function to finish in golang

问题

我可以帮你翻译代码部分,以下是你提供的代码的中文翻译:

func A(){
  go print("hello")
}

func main() {
  A()
  // 在这里,我想要等待打印完成后再执行B()
  B()
}

你想知道如何确保只有在打印完成后才执行B()函数。

英文:

I have the following code in golang:

func A(){
  go print("hello")
}

func main() {
  A()
  // here I want to wait for the print to happen
  B()
}

How can I somehow ensure that B() will be executed only after the print has happened?

答案1

得分: 1

使用sync.Mutex:

var l sync.Mutex

func A() {
	go func() {
		print("你好")
		l.Unlock()
	}()
}

func B() {
	print("世界")
}

func TestLock(t *testing.T) {
	l.Lock()
	A()
	l.Lock()
	// 在这里我想要等待打印完成
	B()
	l.Unlock()
}

使用sync.WaitGroup:

var wg sync.WaitGroup

func A() {
	go func() {
		print("你好")
		wg.Done()
	}()
}

func B() {
	print("世界")
}

func TestLock(t *testing.T) {
	wg.Add(1)
	A()
	wg.Wait()
	// 在这里我想要等待打印完成
	B()
}

使用chan:

func A() chan struct{} {
	c := make(chan struct{})
	go func() {		
		print("你好")
        c <- struct{}{}
	}()
	return c
}

func B() {
	print("世界")
}

func TestLock(t *testing.T) {
	c := A()
	// 在这里我想要等待打印完成
	<-c
	B()
}
英文:

Use sync.Mutex

var l sync.Mutex

func A() {
	go func() {
		print(&quot;hello&quot;)
		l.Unlock()
	}()
}

func B() {
	print(&quot;world&quot;)
}

func TestLock(t *testing.T) {
	l.Lock()
	A()
	l.Lock()
	// here I want to wait for the print to happen
	B()
	l.Unlock()
}

Use sync.WaitGroup

var wg sync.WaitGroup

func A() {
	go func() {
		print(&quot;hello&quot;)
		wg.Done()
	}()
}

func B() {
	print(&quot;world&quot;)
}

func TestLock(t *testing.T) {
	wg.Add(1)
	A()
	wg.Wait()
	// here I want to wait for the print to happen
	B()
}

Use chan

func A() chan struct{} {
	c := make(chan struct{})
	go func() {		
		print(&quot;hello&quot;)
        c &lt;- struct{}{}
	}()
	return c
}

func B() {
	print(&quot;world&quot;)
}

func TestLock(t *testing.T) {
	c := A()
	// here I want to wait for the print to happen
	&lt;-c
	B()
}

答案2

得分: 0

你可以选择以下两种方式:

1)将A()函数改为同步执行:

func A(){
  print("hello") // 去掉go关键字
}

这样,你可以确保在A()函数返回后,print()函数已经执行完毕。

2)等待print()函数执行完毕后再进行下一步操作。

使用一个简单的通道:

func A() chan struct{}{
  c := make(chan struct{})
  go func(){
     print("hello")
     close(c)
  } 
  return c 
}

func main() {
  c := A()
  // 在这里等待print()函数执行完毕
  <-c
  B()
}

你也可以使用sync.Waitgroupx/sync.Errgroup来实现。

英文:

You could either

  1. make A() synchronous
func A(){
  print(&quot;hello&quot;) // go keyword removed
}

This way you are sure that print() has been executed after A returns

  1. Wait for something that only happens after the print() execution

With a simple channel:

func A() chan struct{}{
  c := make(chan struct{})
  go func(){
     print(&quot;hello&quot;)
     close(c)
  } 
  return c 
}

func main() {
  c := A()
  // here I want to wait for the print to happen
  &lt;-c
  B()
}

You could also use a sync.Waitgroup or x/sync.Errgroup

huangapple
  • 本文由 发表于 2023年3月1日 17:00:42
  • 转载请务必保留本文链接:https://go.coder-hub.com/75601491.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定