单线程+异步协程

event_loop:事件循环,相当于一个无限循环(不清楚循环多少次),我们可以把一些特殊函数注册(放置)到这个事件循环上,当满足某些条件的时候,函数就会被循环执行。程序是按照设定的顺序从头执行到尾,运行的次数也是完全按照设定。当在编写异步程序时,必然其中有部分程序的运行耗时是比较久的,需要先让出当前程序的控制权,让其在背后(挂起)运行,让另一部分的程序先运行起来。当背后运行的程序完成后,也需要及时通知主程序已经完成任务可以进行下一步操作,但这个过程所需的时间是不确定的,需要主程序不断的监听状态,一旦收到了任务完成的消息,就开始进行下一步。loop就是这个持续不断的监视器。

coroutine:中文翻译叫协程,在 Python 中常指代为协程对象类型,我们可以将协程对象注册到事件循环中,它会被事件循环调用。我们可以使用 async 关键字来定义一个方法,这个方法在调用时不会立即被执行,而是返回一个协程对象。

task:任务,它是对协程对象的进一步封装,包含了任务的各个状态。

future:代表将来执行或还没有执行的任务,实际上和 task 没有本质区别。

另外我们还需要了解 async/await 关键字,它是从 Python 3.6 才出现的,专门用于定义协程。其中,async 定义一个协程,await 用来挂起阻塞方法的执行。
import asyncio
async def request(url):
    print(‘正在请求:‘,url)
    print(‘下载成功:‘,url)

c = request(‘www.baidu.com‘)

# 第一步:实例化一个事件循环对象
loop = asyncio.get_event_loop()
# 第二步:创建一个任务对象,将协程对象封装到了该对象中
# task = loop.create_task(c)

# 另一种形式实例化任务对象的方法
task = asyncio.ensure_future(c)

#将协程对象注册到事件循环对象中,并且我们需要启动事件循环对象
loop.run_until_complete(task)
# 打印task可以看到任务对象状态
print(task)

绑定回调函数,在爬虫中必须用回调函数,因为在数据爬取下来后,用回调函数可以进行数据解析

import asyncio

async def request(url):
    print(‘正在请求:‘,url)
    print(‘下载成功:‘,url)
    return url

#回调函数必须有一个参数:task
#task.result():任务对象中封装的协程对象对应的特殊函数内部的返回值
def callbak(task):
    print(‘this is callback!‘)
    print(task.result())

c = request(‘www.baidu.com‘)

#给任务对象绑定一个回调函数
#  创建任务对象
task = asyncio.ensure_future(c)
# 绑定回调函数
task.add_done_callback(callbak)

# 注册到时间循环中
loop = asyncio.get_event_loop()

loop.run_until_complete(task)

多任务异步协程

from time import sleep
import asyncio
import time
urls = [‘www.baidu.com‘,‘www.sogou.com‘,‘www.goubanjia.com‘]
start = time.time()
async def request(url):
    print(‘正在请求:‘,url)
    #在多任务异步协程实现中,不可以出现不支持异步的相关代码。
    # sleep(2)
    await asyncio.sleep(2)
    print(‘下载成功:‘,url)

loop = asyncio.get_event_loop()
#任务列表:放置多个任务对象
tasks = []
for url in urls:
    c = request(url)
    task = asyncio.ensure_future(c)
    tasks.append(task)

loop.run_until_complete(asyncio.wait(tasks))

print(time.time()-start)

单线程+多任务异步

# 面试问题,如何提升爬取效率
# 使用方向:数据量大,数据占内存大
#aiohttp:支持异步的一个基于网络请求的模块
# 和requests模块功能应用都一样,区别就是支持异步
# pip install aiohttp

import requests
import asyncio
import time
import aiohttp
#单线程+多任务异步协程
urls = [
    ‘http://127.0.0.1:5000/jay‘,
    ‘http://127.0.0.1:5000/bobo‘,
    ‘http://127.0.0.1:5000/tom‘
]
# 异步效果,遇到阻塞,挂起阻塞,执行别的任务
#代理操作:
#async with await s.get(url,proxy="http://ip:port") as response:
async def get_pageText(url):
    # 请求对象,with不关闭资源,
   async with aiohttp.ClientSession() as s:
      async with await s.get(url) as response:
          # 拿响应数据有可能阻塞所以需要await, 这里是text方法,request是text方法
           page_text = await response.text()
            # 借助于回调函数进行响应数据的解析操作
           return page_text
#封装回调函数用于数据解析
def parse(task):
    #1.获取响应数据
    page_text = task.result()
    print(page_text+‘,即将进行数据解析!!!‘)
    #解析操作写在该位置

start = time.time()
tasks = []
for url in urls:
    c = get_pageText(url)
    task = asyncio.ensure_future(c)
    #给任务对象绑定回调函数用于数据解析
    task.add_done_callback(parse)
    tasks.append(task)
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

print(time.time()-start)


原文地址:https://www.cnblogs.com/wmh33/p/11037385.html

时间: 2024-11-07 19:08:48

单线程+异步协程的相关文章

爬虫 + 数据分析 - 4 异步协程, selenium使用, 自动登录

一.单线程+异步协程 1.基本概念: event_loop:事件循环,相当于一个无限循环,我们可以把一些特殊函数注册(放置)到这个事件循环上, 当满足某些条件的时候,函数就会被循环执行.程序是按照设定的顺序从头执行到尾,运行的次数也是完全按照设定. 当在编写异步程序时,必然其中有部分程序的运行耗时是比较久的,需要先让出当前程序的控制权,让其在背后运行, 让另一部分的程序先运行起来.当背后运行的程序完成后,也需要及时通知主程序已经完成任务可以进行下一步操作, 但这个过程所需的时间是不确定的,需要主

爬虫第四章 单线程+多任务异步协程

单线程+多任务异步协程: asyncio 事件循环 loop: 无限循环的对象,事件循环中最终需要将一些特殊的函数注册到该事件循环中 特殊的函数: 被ansyc关键字修饰的函数 协程: 本质上是一个对象,可以把协程对象注册到事件循环中, 任务对象:就是对协程对象进一步的封装. 绑定回调函数(即在执行完特殊函数之后执行这个回调函数):task.add_done_callback(func) - func(task) :task 参数表示的就是绑定的任务对象 - task.result() 返回的就

单线程实现了多任务异步协程

单线程+多任务异步协程: 意义:提升爬取数据的效率,我们也可以使用线程池, 异步爬虫方式: 多线程/多进程(电脑吃不消,没办法无节制开启)不建议 池:池中的线程或进程也是无法任意开启. 单线程+多任务异步协程(推荐)(500个协程,最优) 概念: 协程:本质就是一个对象,协程对象,怎么去获取?可以使用asynic该关键字去修饰一个函数定义,此时的函数就叫它特殊函数,当该特殊函数被调用之后,就可以返回一个协程对象,特殊之处不仅仅是返回一个协程对象,当函数内部实现的语句不会被立即执行(时间循环开启后

单线程多任务异步协程

目录  1. 概念讲解 2. 多任务异步协程理解 3.基于aiohttp模块异步网络请求实现数据爬取及数据解析 一.需要了解的概念 特殊函数:如果async修饰了一个函数的定义,那么该函数就变成了一个特殊函数, 特殊之处:特殊函数被调用后函数内部实现语句不会被立即执行 该函数调用之后会返回一个协程对象 协程对象:特殊函数调用后可以返回一个协程对象 协程 == 特殊函数 任务对象:对协程对象的进一步封装,就是一个高级协程对象 任务对象 == 协程对象 == 特殊的函数 绑定回调:task.add_

多任务异步协程,asyncio及aiohttp

要实现异步协程,需要满足几个条件: 1,创建协程对象,且协程内部操作需要支持异步. 2,创建任务对象,如需为协程执行结果进行进一步处理,则需要为任务对象绑定回调函数. 3,创建事件循环,并将任务启动. 1 import asyncio 2 import requests 3 from lxml import etree 4 import aiohttp 5 import os 6 7 headers = { 8 9 'User-Agent': 'Mozilla/5.0 (Windows NT 1

06爬虫-异步协程

1. 前言(目的就是大大提升爬虫效率) 在执行IO密集型任务的时候,代码常常遇到IO操作而等待.例如我们在爬虫的时候,用到requests请求的时候,网页响应慢,一直等待着,那么爬虫的效率会大大的降低. 为了解决这类问题,本文就来探讨一下 Python 中异步协程来加速的方法,此种方法对于 IO 密集型任务非常有效.如将其应用到网络爬虫中,爬取效率甚至可以成百倍地提升. 注:本文协程使用 async/await 来实现,需要 Python 3.5 及以上版本. 2. 基本了解 在了解异步协程之前

爬虫速度太慢?来试试用异步协程提速吧!

1. 前言 在执行一些 IO 密集型任务的时候,程序常常会因为等待 IO 而阻塞.比如在网络爬虫中,如果我们使用 requests 库来进行请求的话,如果网站响应速度过慢,程序一直在等待网站响应,最后导致其爬取效率是非常非常低的. 为了解决这类问题,本文就来探讨一下 Python 中异步协程来加速的方法,此种方法对于 IO 密集型任务非常有效.如将其应用到网络爬虫中,爬取效率甚至可以成百倍地提升. 注:本文协程使用 async/await 来实现,需要 Python 3.5 及以上版本. 2.

python爬虫--多任务异步协程, 快点,在快点......

多任务异步协程asyncio 特殊函数: - 就是async关键字修饰的一个函数的定义 - 特殊之处: - 特殊函数被调用后会返回一个协程对象 - 特殊函数调用后内部的程序语句没有被立即执行 - 协程 - 对象.协程==特殊的函数.协程表示的就是一组特定的操作. - 任务对象 - 高级的协程(对协程的进一步的封装) - 任务对象==协程==特殊的函数 - 任务对象==特殊的函数 - 绑定回调: - task.add_done_callback(task) - 参数task:当前回调函数对应的任务

使用coro+anyevent 异步协程获取IP运营商

主要使用coro协程+AnyEvent::HTTP::LWP::UserAgent 异步http请求,查询数据库中IP字段,返回运营商.如需要获取其他类型的字段,修改正则即可, 此方法的好处是,不需要获取本地IP库,提高IP精准度.缺点,需要很好的网络质量.CODE如下: #查询IP的网络提供商 sub search_ip_area { my $self = shift; my ( $dsn, $dbuser, $dbpass, $ips ) = @_; my $ua = AnyEvent::H