go爬虫问题

16 / 168

image.png image.png createWorker中的in管道 没传值request能取到值 源码地址:https://gitee.com/awsomehh/go_crawler

回复(16)
  • demonkjhh 回复
    搁浅~ 2020-02-09 20:41:35

    你看下再什么地方读过 workerChan 的数据,应该读的地方会往 chan models.Request 中写入。

    大佬,能看出来哪里问题吗😰

  • demonkjhh 回复
    搁浅~ 2020-02-09 20:41:35

    你看下再什么地方读过 workerChan 的数据,应该读的地方会往 chan models.Request 中写入。

    image.png 就这个地方读过了 你说正确的那两张图是任务调度器scheduler所有代码了

  • 搁浅~ 回复
    demonkjhh 2020-02-09 20:12:04

    下面没有往chan models.Request里面写数据呀 只是把传入的chan models.Request放入了workerChan队列当中去呀

    你看下再什么地方读过 workerChan 的数据,应该读的地方会往 chan models.Request 中写入。

  • demonkjhh 回复
    额斯尼达耶 2020-02-09 20:01:35

    正解。

    下面没有往chan models.Request里面写数据呀 只是把传入的chan models.Request放入了workerChan队列当中去呀

  • 额斯尼达耶 回复
    搁浅~ 2020-02-09 17:03:02

    你看代码不能只看片面啊,q.workerChan是啥,他也是一个channel而且这个channel中放的是chan models.Request ,所以你要仔细看下哪儿用到了q.workerChan,我猜测肯定是有地方从q.workerChan取出了chan models.Request ,然后再往chan models.Request里面写数据了,思路大概就是这样子,你认真看下这块的逻辑,计算机是严谨科学,出现任何结果都是有迹可循的。

    image.png image.png

    正解。

  • demonkjhh 回复

    不好意思 ,让你失望了 我还是没找到😰

  • demonkjhh 回复
    搁浅~ 2020-02-09 16:54:09

    看下,我刚刚给你回复的, 你仔细看下s.WorkerReady(in)的实现,s是一个Scheduler,你看下Scheduler具体的实现和使用。

    没有对 workerReady 里传入的 channel 写入值

  • 搁浅~ 回复
    demonkjhh 2020-02-09 16:55:04

    image.png 这个就是这个函数呀 没有往里面写入值

    你看代码不能只看片面啊,q.workerChan是啥,他也是一个channel而且这个channel中放的是chan models.Request ,所以你要仔细看下哪儿用到了q.workerChan,我猜测肯定是有地方从q.workerChan取出了chan models.Request ,然后再往chan models.Request里面写数据了,思路大概就是这样子,你认真看下这块的逻辑,计算机是严谨科学,出现任何结果都是有迹可循的。

    image.png image.png

  • demonkjhh 回复
    搁浅~ 2020-02-09 16:51:26

    另外, 我看了你的代码。 只有一个地方可能赋值啊。 你将in当做入参放入了s.WorkerReady(in)函数中,只有可能是在这个函数中往channel中写数据了。

    func createWorker(out chan models.ParseResult, s Scheduler) {
    	in := make(chan models.Request)
    	go func() {
    		for {
    			s.WorkerReady(in)
    			request := <-in
    			logger.Debuglog.Printf("request: %s", request)
    			result, err := Worker(request)
    			if err != nil {
    				continue
    			}
    			out <- result
    		}
    	}()
    }
    

    image.png 这个就是这个函数呀 没有往里面写入值

  • 搁浅~ 回复
    demonkjhh 2020-02-09 16:52:08

    道理我都懂 我跟踪了的 就只发现上面图所使用的 不然我也不会随便就问了呀

    看下,我刚刚给你回复的, 你仔细看下s.WorkerReady(in)的实现,s是一个Scheduler,你看下Scheduler具体的实现和使用。

  • demonkjhh 回复

    image.png 直接在这里初始化管道了 就直接传入 image.png 这里了

  • demonkjhh 回复
    搁浅~ 2020-02-09 16:48:29

    既然知道值,那么根据这个值反推一下应该就知道问题出在哪儿的。 这个值在什么地方定义的,什么地方使用了,什么地方设置了, 一反推就是。

    道理我都懂 我跟踪了的 就只发现上面图所使用的 不然我也不会随便就问了呀

  • 搁浅~ 回复

    另外, 我看了你的代码。 只有一个地方可能赋值啊。 你将in当做入参放入了s.WorkerReady(in)函数中,只有可能是在这个函数中往channel中写数据了。

    func createWorker(out chan models.ParseResult, s Scheduler) {
    	in := make(chan models.Request)
    	go func() {
    		for {
    			s.WorkerReady(in)
    			request := <-in
    			logger.Debuglog.Printf("request: %s", request)
    			result, err := Worker(request)
    			if err != nil {
    				continue
    			}
    			out <- result
    		}
    	}()
    }
    

  • 搁浅~ 回复
    demonkjhh 2020-02-09 16:32:41

    image.png image.png

    models.Request 结构体

    既然知道值,那么根据这个值反推一下应该就知道问题出在哪儿的。 这个值在什么地方定义的,什么地方使用了,什么地方设置了, 一反推就是。

  • demonkjhh 回复
    搁浅~ 2020-02-09 16:24:14
    request := <-in
    

    这一行取到的值是啥呢?

    image.png image.png

    models.Request 结构体

  • 搁浅~ 回复

    request := <-in
    

    这一行取到的值是啥呢?

发表话题
  • 积分
    46
  • 注册排名
    3094