<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                哈哈好久不見啦 今天課程的安排: 調度任務講解 (這個是全部課程的精華,大家認真練習啊) ***** ### 調度任務 應用場景: 我們現在有一個業務就是用戶注冊返送短信驗證碼 用戶注冊->執行短信驗證碼方法 一個用戶注冊就會發送短信驗證碼,這是同步操作的,中間就會發生阻塞,一個人注冊沒有什么感覺,但是10w人同時注冊這個服務器就吃不消了 如果解決這個問題就 我們在這里用到了一個水庫模型 想想: 現在有一條大河,突然有一天漲水了,然后呢?就淹沒城市了哈哈 然后怎么解決呢?就是不止一條河排水 ![](https://box.kancloud.cn/2bc4911bf884bb3365530592f9b60bdf_910x496.png) ![](https://box.kancloud.cn/db0e4dcd2c66bc5611c4d6adccbb0bd9_1134x682.jpg) 一個用戶注冊,我們把發送短信這個放到一個隊列里面,開另一個服務他來消費這個請求 這個就是簡單的一個流量削峰 - 必備基礎 channel和goroutine并發編程基礎 不如不會去看看官方文檔吧 那個go指南這個還是挺簡單的 ### 現在就開始上半部分的課程了 Scheduler - task runner 生產/消費 模型 - timer 定時器 新建taskrunner文件夾 ``` 并建立一下文件 . ├── defs.go 定義 ├── runner.go 任務調用核心 ├── task.go 生產者消費者定義 └── trmain.go ``` defs.go ``` package taskrunner const ( READY_TO_DISPATCH = "d" // 開始生產 通知 READY_TO_EXECUTE = "e" // 開始消費 通知 CLOSE = "c" // 停止 沒有任務可做,或者出錯 ) type controllerChan chan string // 通知 通知處理 type dataChan chan interface{} // 存放處理數據 type fn func (dc dataChan) error // 處理方法 生產者消費者方法 ``` 這樣講的有點多,就大概的講講實現思路吧, 用戶發送消息這個任務扔到MQ里面去,然后那邊就消費就可以了 - 講講定時任務 ``` package taskrunner import "time" /** timer setup start{trigger->task->runner} */ type Worker struct { ticker *time.Ticker // 定時器 runner *Runner } func NewWorker(interval time.Duration,r *Runner) *Worker { return &Worker{ ticker:time.NewTicker(interval * time.Second), runner: r, } } func (w *Worker) startWorker() { for { select { case <- w.ticker.C://這個是阻塞的,當時間到了這里就放行了 go w.runner.StartAll() } } } func Start() { // Start //r :NewWor ..... } ``` 定時任務就是通過<- w.ticker.C的阻塞實現的 我還是吧調度器的代碼給大家敲一遍,能夠理解的就理解下吧 ``` package taskrunner type Runner struct { Controller controllerChan // 控制信息 Error controllerChan // 錯誤信息 Data dataChan // 數據 dataSize int // 數據大小 longlived bool // 是否長期存貨 tree不會回收資源 Dispatcher fn // 生產者 Executor fn // 消費者 } func NewRunner(size int,longlived bool,dispatcher fn,executor fn) *Runner { return &Runner{ Controller:make(chan string,1),// 我們這個需求是非阻塞的 所以用帶buffer的chan Error:make(chan string,1), Data:make(chan interface{},size), longlived:longlived, Dispatcher:dispatcher, Executor:executor, } } func (r *Runner) startDispatch() { // 資源回收 defer func() { if !r.longlived { close(r.Controller) close(r.Data) close(r.Error) } }() forloop: for { select { case c := <-r.Controller: if c == READY_TO_DISPATCH { err := r.Dispatcher(r.Data) if err != nil { r.Error <- CLOSE }else{ r.Controller <- READY_TO_EXECUTE } } if c == READY_TO_EXECUTE { err := r.Executor(r.Data) if err != nil{ r.Error <- CLOSE }else{ r.Controller <- READY_TO_DISPATCH } } case e := <-r.Error: if e == CLOSE { return } default: //如果執行這個 說明消費完了 break forloop } } } func (r *Runner) StartAll() { r.Controller <- READY_TO_DISPATCH r.startDispatch() } ``` 今日課程代碼 [https://github.com/dollarkillerx/GolangWebCourseware/tree/%E8%B0%83%E5%BA%A6%E5%99%A8](https://github.com/dollarkillerx/GolangWebCourseware/tree/%E8%B0%83%E5%BA%A6%E5%99%A8)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看