go并发应用 - 写一个任务调度小程序

作者: ouyangan | 来源:发表于2017-08-04 14:32 被阅读189次
  • 程序可以在分配的时间内完成工作,正常终止;
  • 程序没有及时完成工作,“自杀”;
  • 接收到操作系统发送的中断事件,程序立刻试图清理状态并停止工作
package main

import (
    "errors"
    "fmt"
    "os"
    "os/signal"
    "time"
)

func main() {
    runner := New(time.Duration(1) * time.Second).Add(func(i int) {
        fmt.Println(i)
        time.Sleep(time.Duration(2) * time.Second)
    })
    err := runner.Start()
    if err != nil {
        fmt.Println(err)
    }

}

type Runner struct {
    interrupt chan os.Signal
    complete  chan error
    timeout   <-chan time.Time
    tasks     []func(int)
}

var ErrTimeOut = errors.New("task timeout")
var ErrInterrupt = errors.New("task interrupt")

func New(d time.Duration) *Runner {
    return &Runner{
        interrupt: make(chan os.Signal, 1),
        complete:  make(chan error),
        timeout:   time.After(d),
    }
}

func (r *Runner) Add(tasks ...func(int)) *Runner {
    r.tasks = append(r.tasks, tasks...)
    return r
}

func (r *Runner) Start() error {
    signal.Notify(r.interrupt, os.Interrupt)
    go func() {
        r.complete <- r.run()
    }()

    select {
    case err := <-r.complete:
        fmt.Println("任务执行完毕")
        return err
    case <-r.timeout:
        fmt.Println("任务超时")
        return ErrTimeOut
    }
}

func (r *Runner) run() error {
    for id, task := range r.tasks {
        if r.gotInterrupt() {
            return ErrInterrupt
        }
        task(id)
    }
    return nil

}

func (r *Runner) gotInterrupt() bool {
    select {
    case <-r.interrupt:
        signal.Stop(r.interrupt)
        return true
    default:
        return false
    }

}

参考书籍:go语言实战

相关文章

  • go并发应用 - 写一个任务调度小程序

    程序可以在分配的时间内完成工作,正常终止; 程序没有及时完成工作,“自杀”; 接收到操作系统发送的中断事件,程序立...

  • os任务调度实现原理

    为什么要做任务调度-why 操作系统中最为显著的特性就是任务调度,任务调度主要来自于以下几种需求: 程序并发(mu...

  • (译)Go 语言的工作窃取调度器

    原文链接:Go's work-stealing scheduler Go 调度程序的任务是在多个运行在一个或多个处...

  • Golang笔记-- 并发模式

    并发模式 [TOC] 并发程序指同时进行多个任务的程序, Go程序一种支持并发的方式是通过goroutine和ch...

  • 2019-03-20

    1. go的并发调度模型? go的并发调度模型可以简称为GPM模型,其中G代表goroutine,P代表gorou...

  • Go并发调度

    本文是《循序渐进Go语言》的第六篇-Go并发调度。本文是学习《Go语言学习笔记》的并发调度一章,然后结合阅读源码的...

  • 7.并发与并行

    并发与并行的关系 在单个处理器上采用单核执行多个任务即为并发。在这种情况下,操作系统的任务调度程序会很快从一个任务...

  • context

    在现代分时调度的操作系统中,CPU的调度是分为一个个时间片,分给应用程序使用。 这些程序都是并发执行的,即根据获得...

  • RxSwift文档五(Schedulers)

    代码下载 Schedulers 串行与并发调度程序 自定义调度程序 内置调度程序 Schedulers抽象出执行工...

  • Go语言——goroutine并发模型

    Go语言——goroutine并发模型 参考: Goroutine并发调度模型深度解析&手撸一个协程池 Golan...

网友评论

    本文标题: go并发应用 - 写一个任务调度小程序

    本文链接:https://www.haomeiwen.com/subject/xrwvlxtx.html