16 Star 63 Fork 47

ShirDon-廖显东 / Go语言高级开发与实战-随书代码

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
worker.go 1.85 KB
一键复制 编辑 原始数据 按行查看 历史
ShirDon-廖显东 提交于 2021-12-28 09:45 . commit
//++++++++++++++++++++++++++++++++++++++++
// 《Go语言高级开发与实战》源码
//++++++++++++++++++++++++++++++++++++++++
// Author:廖显东(ShirDon)
// Blog:https://www.shirdon.com/
// 知乎:https://www.zhihu.com/people/shirdonl
// 公众号:源码大数据
// 仓库地址:https://gitee.com/shirdonl/goAdvanced
// 仓库地址:https://github.com/shirdonl/goAdvanced
//++++++++++++++++++++++++++++++++++++++++
package distribute
import (
"fmt"
"gitee.com/shirdonl/goAdvanced/chapter3/crawler"
"net"
"net/http"
"net/rpc"
)
//定义子任务结构体
type Worker struct {
addr string
addUrlChannel chan bool
}
//初始化子任务
func initWorker(addr string) *Worker {
w := &Worker{}
w.addr = addr
w.addUrlChannel = make(chan bool)
return w
}
//运行子任务
func RunWorker(mAddr, wAddr string) {
fmt.Println("=======子任务开始=======")
w := initWorker(wAddr)
//开启RPC任务
go startRpcWorker(w)
register(mAddr, w.addr)
fmt.Println("=======子任务结束=======")
for {
select {
case <-w.addUrlChannel:
fmt.Println("添加URL到通道成功")
}
}
}
//注册
func register(mAddr, wAddr string) {
args := &RegisterArgs{}
args.Worker = wAddr
var reply RegisterReply
call(mAddr, "Master.Register", args, &reply)
}
//执行RPC子任务
func (w *Worker) DoJob(args *DoJobArgs, res *DoJobReply) error {
switch args.JobType {
case "Crawler":
//执行爬虫
crawler.Do(args.Urls)
//添加URL到通道成功
w.addUrlChannel <- true
}
return nil
}
//开启RPC任务
func startRpcWorker(w *Worker) {
//注册RPC
rpc.Register(w)
//处理HTTP
rpc.HandleHTTP()
err := http.ListenAndServe(w.addr, nil)
fmt.Println("注册RPC错误:", err)
rpcServer := rpc.NewServer()
rpcServer.Register(w)
_, e := net.Listen("tcp", w.addr)
if e != nil {
fmt.Println("运行子任务:", w.addr, " 错误: ", e)
}
}
Go
1
https://gitee.com/shirdonl/goAdvanced.git
git@gitee.com:shirdonl/goAdvanced.git
shirdonl
goAdvanced
Go语言高级开发与实战-随书代码
0f051d9f4e35

搜索帮助