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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python bz2模块

    python bz2模块单次压缩和解压缩单次压缩(bz2.compress)In[40]:compressStr=’usebz2moduletocompressstring’In[41]:bz2.compress(compressStr,6)Out[41]:’BZh61AY&SY\xa5i\x9c”\x00\x00\x0f\x99\x80@\x00\x10\x00\x1e\xa7\xde\x

    2022年5月3日
    31
  • break和continue的作用和区别是什么?

    break和continue的作用和区别是什么?break和continue的作用和区别是什么?一、break和continue的作用二、break和continue的区别三、案例分析一、break和continue的作用break和continue都是用来控制循环结构的,主要是停止循环。二、break和continue的区别1、break用于跳出一个循环体或者完全结束一个循环,不仅可以结束其所在的循环,还可结束其外层循环。注意:(1)只能在循环体内和switch语句体内使用break;(2)不管是哪种循环,一旦在循环体中遇到break,系

    2022年6月12日
    37
  • Vue router2.0

    Vue router2.0对于单页面来说路由是我们常用切换页面的一种方式,使用Vue安装npminstallvue-router–save路由的引入importrouterfrom’./router’/*eslint-disableno-new*/newVue({el:’#app’,store,router,components:{App},template:'<App/>’})路由的配置通过和也可以实现我们像a标签一样

    2022年7月11日
    15
  • 树莓派3B安装ffmpeg[通俗易懂]

    树莓派3B安装ffmpeg[通俗易懂]树莓派3B安装ffmpeg树莓派型号:3b操作系统:ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img如果只使用基础功能可以参考https://blog.csdn.net/qq_28877125/article/details/70186287用这里边的配置文件,编译起来的确比较快,十分钟内编译完成,但是,这个只包含了基础功能,我使…

    2022年6月25日
    27
  • FileStream Close「建议收藏」

    FileStream Close「建议收藏」           FileStreamf=newFileStream(“hou.txt”,FileMode.Create,FileAccess.ReadWrite);           StreamWriterwf=newStreamWriter(f);           wf.Write(“Helloworld!”);           wf.Close();

    2022年7月21日
    7
  • odrive入门教程(securecrt使用教程串口)

    ODrive官方入门指南中,采用的是USB连接控制模式(中文翻译版本链接)使用的是NativeProtocol。当我们需要尝试串口通信实现时,需要专程ASCII协议来进行串口通信实现相关的命令,结合着入门指南以及ODrive中的相关属性方法参数,将流程中用到的相关方法整理如下:importserialimporttimeted=serial.Serial(port=’/dev/tty.wchusbserial1470′,baudrate=115200)ted.writ

    2022年4月16日
    50

发表回复

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

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