python爬虫–协程(初识)

python爬虫–协程(初识)

python爬虫–协程

基本知识

  • event_loop:事件循环,相当于一个无限循环,我们可以把一些函数注册到这个事件循环上,当满足某些条件的时候,函数就会被循环执行。
  • coroutine:携程对象,我们可以将携程对象注册到事件循环中,它会被时间循环调用。我们可以使用async关键字来定义一个方法,这个方法在调用时不会被立即执行,而是返回一个协程对象。
  • task:任务,它是对协程对象的进一步封装, 包含了任务的各个状态。
  • future:代表将来执行或还没有执行的任务,实际上和task 没有本质区别。
  • async定义-个协程.
  • await用来挂起阻塞方法的执行。

协程的基本使用

import asyncio

async def request(url):
    print('正在请求的url是:',url)
    print('请求成功:',url)
#async修饰的函数,调用之后返回的一个协程对象
c = request('www.baidu.com')

# #创建一个事件循环对象
# loop = asyncio.get_event_loop()
#
# #将携程对象注册到loop中,然后启动loop
# loop.run_until_complete(c)

# #task的使用
# loop = asyncio.get_event_loop()
# #基于loop创建一个task对象
# task = loop.create_task(c)
# print(task)
# loop.run_until_complete(task)
# print(task)

#future的使用
loop = asyncio.get_event_loop()
task = asyncio.ensure_future(c)
print(task)
loop.run_until_complete(task)
print(task)

多任务协程实现

import asyncio
import time

async def request(url):
    print('正在请求的url是:',url)
    #在异步协程中如果出现同步模块相关的代码,那么就无法实现异步
    #time.sleep(2)
    await asyncio.sleep(2)
    print('请求成功:',url)
#async修饰的函数,调用之后返回的一个协程对象
start = time.time()
urls = {
   
    'www.123.com',
    'www.234.com',
    'www.345.com'
}
#存放多个任务对象
stask = []
for url in urls:
    c = request(url)
    task = asyncio.ensure_future(c)
    stask.append(task)
loop = asyncio.get_event_loop()

loop.run_until_complete(asyncio.wait(stask))

print(time.time()-start)

多任务协程异步实现

在进行多任务协程实现前,还需要建立一个简单的本地http服务

from flask import Flask
import time

app = Flask(__name__)

@app.route('/azb')
def index_azb():
    time.sleep(2)
    return 'Hello azb'

@app.route('/xx')
def index_xx():
    time.sleep(2)
    return 'Hello xx'

@app.route('/hh')
def index_hh():
    time.sleep(2)
    return 'Hello hh'

if __name__ == '__main__':
    app.run(threaded=True)

在这里插入图片描述

实现

import requests,asyncio,time

start = time.time()
urls = [
    'http://127.0.0.1:5000/azb','http://127.0.0.1:5000/xx','http://127.0.0.1:5000/hh'
]

async def get_page(url):
    print('正在下载',url)
    #request是基于同步,必须使用基于异步的网络请求模块
    response = requests.get(url=url)
    print('下载成功!',url)

tasks = []

for url in urls:
    c = get_page(url)
    task = asyncio.ensure_future(c)
    tasks.append(task)

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

print('总耗时',time.time()-start)

在这里插入图片描述

aiohttp模块引入

import requests,asyncio,time,aiohttp

start = time.time()
urls = [
    'http://127.0.0.1:5000/azb','http://127.0.0.1:5000/xx','http://127.0.0.1:5000/hh'
]

async def get_page(url):
    async with aiohttp.ClientSession() as session:
        async with await session.get(url) as response:
            #text()返回字符串形式的响应数据
            #read()返回的二进制形式的响应数据
            #json()返回的就是json对象
            #获取响应数据操作之前一定要使用await进行手动挂起

            page_text = await response.text()
            print(page_text)

tasks = []

for url in urls:
    c = get_page(url)
    task = asyncio.ensure_future(c)
    tasks.append(task)

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

print('总耗时',time.time()-start)



在这里插入图片描述

协程还是没有理解

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100101.html原文链接:https://javaforall.net

(0)
上一篇 2021年4月16日 下午8:00
下一篇 2021年4月16日 下午10:00


相关推荐

  • C语言面试题—指针篇(一)

    C语言面试题—指针篇(一)原创 2017 12 22 创新教育研究中心 TeachPlus nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp C 语言面试题 指针篇 一 指针的使用 一直是 c 语言面试题中必考的部分 因为指针本身使用的复杂性与普适性 所以考点非常多 而且也可以与其他知识相互结合 因此我们将会使用五篇专题的篇幅来介绍指针 分析下面的程序

    2026年3月27日
    2
  • 大数据治理之我见

    大数据治理之我见大数据理念从被炒火至今一直持续着热度 很多企业也开始抱着理性的态度去看待大数据分析 在笔者之前的文章中曾写道 大数据并不是适合所有企业 即使要做大数据分析 也要有一套正确的理念和落地方案 包括 意识行动 数据思维 结合自身等 本文主要假设企业已经具备数据思维 大数据意识等能力模型 并在此基础上进行大数据分析建设 针对信息化建设上的大数据实施前提 实施过程 方法等与大家交流分享 1 相关理解

    2026年3月20日
    2
  • IDEA中文乱码怎么办

    IDEA中文乱码怎么办如果你看了很多文章也没有解决 IDEA 中文乱码的问题 或许可以尝试更换一下 jdk 的版本

    2026年3月16日
    3
  • 博弈论三个枪手的故事_博弈模型的三个基本要素

    博弈论三个枪手的故事_博弈模型的三个基本要素彼此痛恨的甲、乙、丙三个枪手准备决斗。甲枪法最好,十发八中;乙枪法次之,十发六中;丙枪法最差,十发四中。先提第一个问题:如果三人同时开枪,并且每人只发一枪;第一轮枪战后,谁活下来的机会大一些?一般人认为甲的枪法好,活下来的可能性大一些。但合乎推理的结论是,枪法最糟糕的丙活下来的几率最大。我们来分析一下各个枪手的策略。枪手甲一定要对枪手乙先开枪。因为乙对甲的威胁要比丙对甲的威胁更大,甲应该首…

    2022年10月15日
    4
  • 猴子摘香蕉问题python_硬币找零&&爬楼梯&&猴子摘香蕉「建议收藏」

    猴子摘香蕉问题python_硬币找零&&爬楼梯&&猴子摘香蕉「建议收藏」硬币找零&&爬楼梯&&猴子摘香蕉假设有几种硬币,如1、3、5,并且数量无限。请找出能够组成某个数目的找零所使用最少的硬币数。#include”CoinProblem.h”#includeintcountNum=MAX;voidCoinProblem(int*coin,intLength,intValue,intcount){if(Value==0){if(count…

    2026年4月13日
    3
  • win7中USB音箱没有声音解决的方法

    win7中USB音箱没有声音解决的方法

    2021年12月4日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号