asyncio Queue的使用例子
- import aiohttp
- import asyncio
- import async_timeout
- from urllib.parse import urljoin, urldefrag
- root_url = "http://python.org/"
- crawled_urls, url_hub = [], [root_url, "%s/sitemap.xml" % (root_url), "%s/robots.txt" % (root_url)]
- headers = {'user-agent': 'Opera/9.80 (X11; Linux x86_64; U; en) Presto/2.2.15 Version/10.10'}
- async def get_body(url):
- async with aiohttp.ClientSession() as session:
- try:
- with async_timeout.timeout(10):
- async with session.get(url, headers=headers) as response:
- if response.status == 200:
- html = await response.text()
- return {'error': '', 'html': html}
- else:
- return {'error': response.status, 'html': ''}
- except Exception as err:
- return {'error': err, 'html': ''}
- async def handle_task(task_id, work_queue):
- while not work_queue.empty():
- queue_url = await work_queue.get()
- if not queue_url in crawled_urls:
- crawled_urls.append(queue_url)
- body = await get_body(queue_url)
- if not body['error']:
- for new_url in get_urls(body['html']):
- if root_url in new_url and not new_url in crawled_urls:
- work_queue.put_nowait(new_url)
- else:
- print(f"Error: {body['error']} - {queue_url}")
- def remove_fragment(url):
- pure_url, frag = urldefrag(url)
- return pure_url
- def get_urls(html):
- new_urls = [url.split('"')[0] for url in str(html).replace("'",'"').split('href="')[1:]]
- return [urljoin(root_url, remove_fragment(new_url)) for new_url in new_urls]
- if __name__ == "__main__":
- q = asyncio.Queue()
- [q.put_nowait(url) for url in url_hub]
- loop = asyncio.get_event_loop()
- tasks = [handle_task(task_id, q) for task_id in range(3)]
- loop.run_until_complete(asyncio.wait(tasks))
- loop.close()
- for u in crawled_urls:
- print(u)
- print('-'*30)
- print(len(crawled_urls))
asyncio Queue的使用例子的更多相关文章
- python中利用队列asyncio.Queue进行通讯详解
python中利用队列asyncio.Queue进行通讯详解 本文主要给大家介绍了关于python用队列asyncio.Queue通讯的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细 ...
- threading包的例子和queue包的例子
参考:https://www.cnblogs.com/tkqasn/p/5700281.html 参考:https://www.cnblogs.com/tkqasn/p/5700281.html th ...
- asyncio queue
from asyncio import Queue,sleep import asyncio from threading import Thread import time qu=Queue() # ...
- rabbit的简单搭建,java使用rabbitmq queue的简单例子和一些坑
一 整合 由于本人的码云太多太乱了,于是决定一个一个的整合到一个springboot项目里面. 附上自己的项目地址https://github.com/247292980/spring-boot 以整 ...
- python 多进程使用Queue通信的例子
import time from multiprocessing import Process,Queue MSG_QUEUE = Queue(5) def startA(msgQueue): whi ...
- python异步编程模块asyncio学习(二)
尽管asyncio应用通常作为单线程运行,不过仍被构建为并发应用.由于I/O以及其他外部事件的延迟和中断,每个协程或任务可能按一种不可预知的顺序执行.为了支持安全的并发执行,asyncio包含了thr ...
- 深入Asyncio(二)从线程到协程
线程的真相 多线程并不是一无是处,在实际问题中,要权衡优劣势来选择多线程.多进程或是协程.协程为多线程的某些问题提供了一种解决方案,所以学习协程首先要对线程有一定了解. 多线程优点 代码可读性 多线程 ...
- 深入Asyncio(三)Asyncio初体验
Asyncio初体验 Asyncio在Python中提供的API很复杂,其旨在替不同群体的人解决不同的问题,也正是由于这个原因,所以很难区分重点. 可以根据asyncio在Python中的特性,将其划 ...
- asyncio:python3未来并发编程主流、充满野心的模块
介绍 asyncio是Python在3.5中正式引入的标准库,这是Python未来的并发编程的主流,非常重要的一个模块.有一个web框架叫sanic,就是基于asyncio,语法和flask类似,使用 ...
随机推荐
- 《老梁四大名著情商课》笔记-学学TA,你就是聚会的万人迷
<老梁四大名著情商课>笔记-学学TA,你就是聚会的万人迷 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 现在社会学家有一个统计,说中国处在单身状态大概有2个亿.这些人中 ...
- shiro的基本认识及做一个简单的授权登陆的例子
先推荐一个网站,无意中发现的.感觉蛮好的. 推荐一套完整的Shiro Demo,免费的.Shiro Demo:http://www.sojson.com/shiroDemo已经部署到线上,地址是htt ...
- Elasticsearch集群节点配置详解
注意:如果是在局域网中运行elasticsearch集群也是很简单的,只要cluster.name设置一致,并且机器在同一网段下,启动的es会自动发现对方,组成集群. 2.elasticsearch- ...
- Oracle12c开启scott账户
在oracle目录app\orcl\product\12.1.0\dbhome_1\NETWORK\ADMIN\下tnsnames.ora文件最后加入以下内容 PDBORCL = (DESCRIPTI ...
- css3实现单行文本溢出显示省略号
文本超出一定宽度让其隐藏,以省略号替代 width:200px; white-space:nowrap; text-overflow:ellipsis; overflow:hidden; 如下图
- for each循环(增强for循环)
底层实现是使用了迭代器,简化了迭代器的书写 格式: for(集合/数组的数据类型 变量名: 数组名/集合名) { // body } char[] chars = {'c', 'd', 'd', 'e ...
- DBUtils数据库连接池
DBUtils pip install DBUtils 模式一: 为每个线程创建一个连接.(内部是通过threading.local实现的) 模式二: 创建一定个数的连接,所有线程都来连接池中获取.( ...
- Javaweb学习笔记——(十八)——————事务、DBCP、C3P0、装饰者模式
事务 什么是事务? 转账: 1.给张三账户减1000元 2.给李四账户加1000元 当给张三账户减1000元之后,抛出了异常,这 ...
- redis整合Spring集群搭建及业务中的使用
1.redis安装 Redis是c语言开发的. 安装redis需要c语言的编译环境.如果没有gcc需要在线安装.yum install gcc-c++ 安装步骤: 第一步:redis的源码包上传到li ...
- 【U3d】场景加载-GameStart!
目的:实现点击按钮场景切换 一共四个步骤,轻松食用(ง •̀_•́)ง 1. GameObject→UI→Button向开始场景中添加按钮,示例如下 2. 新建script——"LoadSc ...