前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在获取数据的时候会根据每个 task 的 respChan 数据来做排序

在获取数据的时候会根据每个 task 的 respChan 数据来做排序

原创
作者头像
用户7365393
修改2021-09-26 17:24:18
4830
修改2021-09-26 17:24:18
举报
文章被收录于专栏:人生得意须尽欢

在获取数据的时候会根据每个 task 的 respChan 数据来做排序

sender 会将所有的 task 放入到 taskCh 中,发送完毕之后关闭 channel。

下面再来看看 worker:

代码语言:javascript
复制
Copyfunc (worker *copIteratorWorker) run(ctx context.Context) {
	defer func() {
		failpoint.Inject("ticase-4169", func(val failpoint.Value) {
			if val.(bool) {
				worker.memTracker.Consume(10 * MockResponseSizeForTest)
				worker.memTracker.Consume(10 * MockResponseSizeForTest)
			}
		})
		worker.wg.Done()
	}()
	for task := range worker.taskCh {
		respCh := worker.respChan
		// 这里是需要排序的时候为空,那么为每个 task 都创建一个 respChan
		if respCh == nil {
			respCh = task.respChan
		}
		// 发送rpc请求
		worker.handleTask(ctx, task, respCh)
		if worker.respChan != nil { 
			// 发送 finCopResp 到 respCh 中,告诉copIterator有一个task已经运行完毕了
			worker.sendToRespCh(finCopResp, worker.respChan, false)
		}
		close(task.respChan)
		if worker.vars != nil && worker.vars.Killed != nil && atomic.LoadUint32(worker.vars.Killed) == 1 {
			return
		}
		select {
		case <-worker.finishCh:
			return
		default:
		}
	}
}

worker 主要是处理 sender 发送过来的 taskCh 数据,通过遍历 taskCh 获取 task 之后调用 handleTask 发送 rpc 请求,返回的数据会放入到 respCh 中。需要注意这里如果是有序的 task ,那么 worker.respChan 为空,然后会为每个 task 创建一个 respChan,在获取数据的时候会根据每个 task 的 respChan 数据来做排序。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 在获取数据的时候会根据每个 task 的 respChan 数据来做排序
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档