采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
gen.mult返回的不是一个future的容器么,不直接运行,这里为什么注释掉 结果还是一样的呢?
你把代码贴一下 截图说明一下我看看
已上传,请老师帮忙看看
就是老师课上写的 tornado spider
from urllib.parse import urljoin from bs4 import BeautifulSoup from tornado import gen, httpclient, ioloop, queues base_url = "http://www.tornadoweb.org/en/stable/" concurrency = 3 async def get_url_links(url): response = await httpclient.AsyncHTTPClient().fetch("http://www.tornadoweb.org/en/stable/") html = response.body.decode("utf8") soup = BeautifulSoup(html) links = [urljoin(base_url, a.get("href")) for a in soup.find_all("a", href=True)] return links async def main(): seen_set = set() q = queues.Queue() async def fetch_url(current_url): #生产者 if current_url in seen_set: return print("获取: {}".format(current_url)) seen_set.add(current_url) next_urls = await get_url_links(current_url) for new_url in next_urls: if new_url.startswith(base_url): #放入队列, await q.put(new_url) async def worker(): async for url in q: if url is None: return try: await fetch_url(url) except Exception as e: print("excepiton") finally: q.task_done() #放入初始url到队列 await q.put(base_url) #启动协程 workers = gen.multi([worker() for _ in range(concurrency)]) await q.join() for _ in range(concurrency): await q.put(None) await workers if __name__ == "__main__": io_loop = ioloop.IOLoop.current() io_loop.run_sync(main)
你可以把完整的代码贴一下 我本地运行试试
已经上传 麻烦老师解答
最后一行的 await workers
登录后可查看更多问答,登录/注册
异步IO并发编程/Form,ORM/aiomysql、peewee-async/epoll
1.4k 18
2.2k 15
1.5k 15
1.5k 12
2.3k 11
购课补贴联系客服咨询优惠详情
慕课网APP您的移动学习伙伴
扫描二维码关注慕课网微信公众号