python 生产者 --- 消费者
值得拿出来 看看的
多进程 爬取 (生产) , 解析 (消费) 网页 同时进行,可以作为以后项目扩展使用
from bs4 import BeautifulSoup
import requests
import time
import multiprocessing as mp
import re
from multiprocessing import Queue
# from multiprocessing import JoinableQueue as Queue
base_url = 'https://morvanzhou.github.io/'
def crawl(url):
html = requests.get(url).text
# 模拟请求时间消耗 0.1 s
time.sleep(0.1)
return html
def parse(html):
soup = BeautifulSoup(html,'lxml')
all_anchors = soup.find_all('a',{'href':re.compile(r'^/.+?/$')})
# title = soup.find('meta',{'property':'og:title'})
page_urls = {anchor.get_text().strip():base_url+anchor['href'] for anchor in all_anchors}
main_url = soup.find('meta',{'property':'og:url'})['content']
return main_url,page_urls
# print(html)
def main():
# unseen 本可以定义多个
unseen = (base_url,)
seen = ()
# 为了让 html 爬取 与 html 解析 同步进行,所以这里使用 生产者--消费者 模式
html_queue = Queue()
# 开启进程池
# 生产者 即 html 爬取
crawl_pool = mp.Pool(2)
# 消费者 即 html 解析
parse_pool = mp.Pool(2)
for url in unseen:
# 若一直 有 要被爬取的 html 则 一直进行
html_queue.put(crawl_pool.apply_async(crawl,args=(url,)).get())
else:
# 已经爬取完成所有 页面
html_queue.put(None) # 此处向队列发送 生产完成信号,不然方法一直被阻塞
results = []
# 开启循环 消费生产出的 html,对其进行解析
while True:
html=html_queue.get()
if html:
results.append(parse_pool.apply_async(parse,args=(html,)).get())
else:
# html_queue.task_done()
break
print(results)
if __name__ == '__main__':
main()
python 生产者 --- 消费者的更多相关文章
- python生产者消费者模型
业界用的比较广泛,多线程之间进行同步数据的方法,解决线程之间堵塞,互相不影响. server --> 生产者 client --> 消费者 在一个程序中实现又有生产者又有消费者 ,生产者不 ...
- python生产者消费者模型优点
生产者消费者模型:解耦,通过队列降低耦合,支持并发,生产者和消费者是两个独立的并发体,他们之间使用缓存区作为桥梁连接,生产者指望里丢数据,就可以生产下一个数据了,消费者从中拿数据,这样就不会阻塞,影响 ...
- 操作系统OS,Python - 生产者消费者模型
1. 缓冲区(此处用阻塞队列充当),解决消费者和生产者强耦合问题.(生产者和消费者不直接通信) 2. 通过平衡生产者线程和消费者线程,来提高程序整体处理数据速度. 3. 在并发编程中该模式能解决大多数 ...
- python 生产者消费者模型
import time def consumer(name): print("%s开始吃包子了"%name) while True: ret = yield time.sleep( ...
- Python学习笔记——进阶篇【第九周】———线程、进程、协程篇(队列Queue和生产者消费者模型)
Python之路,进程.线程.协程篇 本节内容 进程.与线程区别 cpu运行原理 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Ev ...
- 【Python@Thread】queue模块-生产者消费者问题
python通过queue模块来提供线程间的通信机制,从而可以让线程分项数据. 个人感觉queue就是管程的概念 一个生产者消费者问题 from random import randint from ...
- 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼
1. 操作系统基本知识,进程,线程 CPU是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...
- python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型
一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...
- Python 使用python-kafka类库开发kafka生产者&消费者&客户端
使用python-kafka类库开发kafka生产者&消费者&客户端 By: 授客 QQ:1033553122 1.测试环境 python 3.4 zookeeper- ...
随机推荐
- [转载]——说说IO
本文转载自"和你在一起"的"说说IO"系列文章https://pengjiaheng.iteye.com/,总共分为8篇,特意整理.收录在此,支持原创.尊重原创 ...
- C#-反射reflection
目录 简介 引入 1.新建类库 2. 类库的使用 3.反射 反射实例1 反射实例2 反射实例3 C# shanzm 简介 反射(reflection)是什么? 在<精通C#>中是这么说的& ...
- 是时候选择一款富文本编辑器了(wangEditor)
需要一款富文本编辑器,当然不能自己造轮子.本来想使用cnblog也在用的TinyMCE,名气大,功能全.但是发现TinyMCE从4.0开始,不再支持直接下载.所以还是决定选用wangEditor.遗憾 ...
- 前端开发 JavaScript 规范文档
一,规范目的 为提高团队协作效率,便于前端后期优化维护,输出高质量的文档. 二.基本准则 符合web标准,结构表现行为分离,兼容性优良.页面性能方面,代码要求简洁明了有序, 尽可能的减小服务器负载,保 ...
- 【C语言】位运算
编写一个函数getbits,从一个16位的单元中取出某几位(即该几位保留原值,其余位0).函数调用形式为getbits(value,n1,2).----简单题目遇到想不到的问题 c语言位运算经典问题: ...
- ubuntu搭建JavaEE环境
安装Jave和Tomcat 参考:安装Java和Tomcat 安装eclipse 下载地址:https://www.eclipse.org/downloads/packages/ 我下载的时Eclip ...
- Django-5 模板层
Django 模板层 在之前的例子中,我们采用了硬编码的方式,来返回文本 def current_datetime(request): now = datetime.datetime.now() ht ...
- Oracle计算两天两个日期间相差的天数
Oracle计算两天两个日期间相差的天数: select to_date('19930411','yyyymmdd')-to_date('19890507','yyyymmdd') from dual ...
- 微信小程序字体设置
微信小程序css篇----字体(Font) 一.字体:font.属性在一个声明中设置所有字体属性. 可设置的属性是(按顺序): "font-style font-variant font-w ...
- Singleton多种实现方式的在多线程情况下的优缺点
一.饿汉式 缺点:不能懒加载 // 不能懒加载 public class SingletonObject1 { private static final SingletonObject1 instan ...