请教大伙一个问题,我调试了半天,发现 gen.return 返回异步结果后,程序不是接着 yield 的地方执行,而是又跳到 ioloop,tornado 初学,文档较少,希望大家能帮忙指出错误在哪,感激 部分程序如下
@gen.coroutine
def _fetch_and_extract(self, task):
self.processing_task_number += 1
self.processing_task_set.add(task)
if self.processing_task_number != self.processing_task_set.size():ioloop.IOLoop.instance().stop()
self.logger.info("%s: start to fetch and extract" % self.worker_name)
if check_task(task):
try:
spider = load_object(task["spider"])
except Exception, e:
handle_fail_task(task,"load %s object failed" % (task["spider"]),self.process_fail_task_queue, self.wait_for_process_task_queue)
self.logger.error("%s: load object failed.path:%s, exception:%s" % (self.worker_name, task["spider"], e))
else:
spider_object = spider(self.processed_url_set, self.wait_for_process_task_queue)
fetch_start_time = datetime.datetime.now()
resp = yield spider_object.fetch(task["request"])
self.logger.debug("got resp already ”)#已打印
#这里已经拿到异步返回的 resp 了,但是代码没有恢复接着往下走,而是直接回到 loop 去取 task 了,但是这时候 task 里空了,所以之后就一直提示任务空
#相当于只抓了美团 api 的 city 列表,后面 extract、再添加 task 都没有执行,我 debug 时候比较奇怪这点,按道理异步返回 resp 了应该接着之前代码的位置继续执行 不是么
if resp == None or resp.error != None:
handle_fail_task(task, "fetch request: %s failed,code:%d error:%s" % (task["request"], resp.code, resp.error), self.process_fail_task_queue, self.wait_for_process_task_queue)
self.logger.error("%s: fetch request: %s failed, error: %s" % (self.worker_name, task["request"], resp))
else:
content_length = resp.headers['Content-Length'] if resp.headers.has_key('Content-Length') else None
last_modified = resp.headers['Last-Modified'] if resp.headers.has_key("Last-Modified") else None
fetch_time = datetime.datetime.now() - fetch_start_time
extract_start_time = datetime.datetime.now()
status = yield spider_object.extract(resp, **dict(task["kwargs"])
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.