English 中文(简体)
如何开始一项独立于主要任务的任务的任务
原标题:how golang starts a task independent of the main task

如何开始一项任务,主要任务回报,但艰巨的任务可以继续下去。 最好控制任务的时间,例如通过时间控制。

my code is

package main

import (
    "fmt"
    "time"
)

func asyncTask() {
    fmt.Println("task start")
    time.Sleep(2 * time.Second)
    fmt.Println("task end")
}

func main() {
    fmt.Println("main start ")

    go asyncTask()

    fmt.Println("task...")
    time.Sleep(3 * time.Second)
    fmt.Println("main end")
}

i 希望主要功能无需睡觉。 这项任务在返回后继续展开。

问题回答

main 退出时,该方案即告结束,所有暂停。 <代码>main 必须有办法等到所有活力结束为止。 你可以纠正,有比睡觉更好的办法;同时在法典中睡觉是红色旗帜。 这里有一些基本选择。

Simplest is to use a channel.

package main

import (
    "fmt"
    "time"
)

func worker(done chan bool) {
    fmt.Print("working...")
    time.Sleep(time.Second)
    fmt.Println("done") 

    done <- true
}

func main() {
    done := make(chan bool, 1)
    go worker(done) 

    <-done
}

主要是向工人输送渠道。 <代码><-done, 主要是等待阅读的。 工人一旦完成,就会将实际价值投向已实现的渠道(价值为t,主读并能够继续。

更多工人使用

package main

import (
    "fmt"
    "sync"
    "time"
)

func worker(id int) {
    fmt.Printf("Worker %d starting
", id)
    time.Sleep(time.Second)
    fmt.Printf("Worker %d done
", id)
}

func main() {
    var wg sync.WaitGroup   

    for i := 1; i <= 5; i++ {
        wg.Add(1)

        go func() {
            defer wg.Done()
            worker(i)
        }()
    }   

    wg.Wait()
}

主要创建者为:sync.WaitGroup。 每当它开始一条路程时,它就向该团体增加了1个。 每位工人都用一个叫<代码>wg的路条进行包装。 Done , 工作完成时,从小组中减去1份。 <代码>wg.Wait()将等到WaitGroup回到0时表示所有工人都做了工作为止。

经营时间管理所有企业。 您的问题似乎意在问,即使主人完成其工作,如何保证执行守则。 答案是组别和组别。

你的光辉榜样在例行检查会发生的事情时会有更多的等待时间。

package main

import (
    "fmt"
    "sync"
    "time"
)

func asyncTask(sleepTime int, wg *sync.WaitGroup) {
    fmt.Printf("task start %ds
", sleepTime)
    time.Sleep(time.Duration(sleepTime) * time.Second)
    fmt.Printf("task end :%ds
", sleepTime)
    if wg != nil {
        defer wg.Done()
    }
}

func main() {
    fmt.Println("->main start ")
    var wg sync.WaitGroup
    wg.Add(1)
    go asyncTask(6, nil)
    go asyncTask(4, &wg)
    time.Sleep(2 * time.Second)
    fmt.Println("->main end")
    wg.Wait()
}

第一个目标没有达到目的,而第二个目标则是(甚至再睡觉)。

我建议你阅读





相关问题
Asynchronous data loading in Entity-Framework?

Did anyone hear about asynchronous executing of an EF query? I want my items control to be filled right when the form loads and the user should be able to view the list while the rest of the items ...

Does PHP support asynchronous programming?

I m new to PHP. I am familiar with ASP.NET which support asynchronous programming. That is, if one request needs to do some I/O job. It is suggested to program the web page with BeginProcess/...

How to cancel an asynchronous call?

How to cancel an asynchronous call? The .NET APM doesn t seem to support this operation. I have the following loop in my code which spawns multiple threads on the ThreadPool. When I click a button on ...

What can cause select to block in Python?

Here s a snippet of code I m using in a loop: while True: print loop rlist, wlist, xlist = select.select(readers, [], [], TIMEOUT) print selected # do stuff At a certain point, ...

热门标签