首页 > 其他分享 >爬虫-协程及语法

爬虫-协程及语法

时间:2024-01-18 20:55:34浏览次数:22  
标签:__ 协程 爬虫 语法 time print main asyncio

一、什么是协程

  在单线程中,一个线程在运行的过程中,如果遇到一些IO操作的时候,CPU会停止等待,此时线程会处于阻塞状态,为了更好的利用CPU,

  当线程阻塞的时候,让线程去做其他的事情,从而提高CPU的利用率,如下面代码

import time
def fun():
    print("开始打印,然后休息3s")
    time.sleep(3)
    print("休息3秒再干")
if __name__ == '__main__':
    fun()

在上面的过中,有3秒,cpu不是为你所用,有可能阻塞或做其他的事情,如何想让CPU一直未其所用

  当线程在遇到IO操作的时候,将线程中的任务切换进行切换,切换到非IO操作中,等原来的IO执行完成后,在恢复执行原来的任务,就是协程

如果需要协程,需要改进;

import time
import asyncio
async def fun():
    print("开始打印,然后休息3s")
    time.sleep(3)
    print("休息3秒再干")
if __name__ == '__main__':
    fun()

运行结果:

RuntimeWarning: coroutine 'fun' was never awaited   fun()
RuntimeWarning: Enable tracemalloc to get the object allocation traceback

这是因为,当函数前面加上async后,就是一个协程对象,类似一个生成器,执行方式就不是这样了,应该是下面的方式

import time
import asyncio
async def fun():
    print("开始打印,然后休息3s")
    time.sleep(3)
    print("休息3秒再干")
if __name__ == '__main__':
    coroutine = fun()
    print(coroutine) #<coroutine object fun at 0x000001B69F1993C0>
    asyncio.run(coroutine)    #利用run去运行协程对象

运行时间并效果并不明显,看下面代码

import asyncio
import time
async def func1():
    print("fun1,start")
    await asyncio.sleep(4)
    print("fun1,end")

async def func2():
    print("fun2,start")
    await asyncio.sleep(2)
    print("fun2,end")

async def func3():
    print("fun3,start")
    await asyncio.sleep(3)
    print("fun3,end")

async def main():
    print("satrt")
    tasts = [       #创建协程列表
        asyncio.create_task (func1()),
        asyncio.create_task (func2()),
        asyncio.create_task (func3())
    ]
    await asyncio.wait(tasts)
    
if __name__ == "__main__":
    satrt = time.time()
    asyncio.run(main())
    end = time.time()
    print(end-satrt)

运行结果,正常运行至少时间在 4 + 2+ 3 = 9s,现在只有4s多

satrt
fun1,start
fun2,start
fun3,start
fun2,end
fun3,end
fun1,end
4.024667501449585

说明:协议等待用await:当任务被挂起后,cpu会自动切换到其他任务中去,await一般写在函数里,不能放在main入口里

await asyncio.wait(tasts)
等价下面的写法
lop = asyncio.get_event_loop()
lop.run_until_complete(asyncio.run(tasts))

利用协程爬虫:

import asyncio
import time

async def download(url):
    print("开始抓取")
    await  asyncio.sleep(3) #网络请求的过程,这里不是request.get()了
    print("下载完成",url)
    # return "这是源代码"

async def main():
    urls = [
        "http://www.baidu.com",
        "http://huawei.com",
        "http://sougou.com"
    ]
    #生成任务列表
    tasks = []
    for url in urls:
        d = download(url)
        tasks.append(d)

    await asyncio.wait(tasks)

if __name__ == '__main__':
    asyncio.run(main())  #启动协程

标签:__,协程,爬虫,语法,time,print,main,asyncio
From: https://www.cnblogs.com/zp513/p/17973251

相关文章

  • SpiderFlow爬虫平台漏洞利用分析(CVE-2024-0195)
    1.漏洞介绍SpiderFlow爬虫平台项目中spider-flow-web\src\main\java\org\spiderflow\controller\FunctionController.java文件的FunctionService.saveFunction函数调用了saveFunction函数,该调用了自定义函数validScript,该函数中用户能够控制 functionName、parameters 或 sc......
  • 19、nginx中location语法
    1.概述在实际应用中,权限控制的需求更加复杂。例如,对于网站下的img目录允许所有用户访问,但对于网站下的admin目录则仅允许管理员身份的用户访问。此时,仅靠deny和allow这两个权限指令不能满足用户的需求,还需要使用location块来完成相关需求的匹配。2.location语法location......
  • 爬虫的urllib使用
    1.基础使用importurllib.requestresponse=urllib.request.urlopen(url)print(response.read().decode('utf-8'))print(type(response))print(response.status)print(response.getheaders())HTTPResponse类型方法:read方法是按照字节读取response.readlines方法按照......
  • 从python 单机版爬虫 scrapy 到 分布式scrapy-redis 爬虫用最简单的步骤创建实例
    scrapy是很强大的模块化爬虫框架,具有很高的灵活性,使用频率很高,使用该框架能大大提高开发效率,scrapy-redis是在scrapy框架开发了组件,替换队列部分,实现多台服务器并行运行爬虫,提高爬取速度。下面是用最简单的例子从建立普通scrapy爬虫,然后数据保存mysql,最后简单替换几行就能使用s......
  • Markdown语法详解
    Markdown学习标题:#空格标题名二级标题字体HelloWorld!两边加一个*变成斜体HelloWordl!两边加两个*变成粗体HelloWordl!两边加~~HelloWordl!两边***斜体粗体引用我是一个很牛逼的程序员>空格分割线三个-或者三个*图片!jietu](C:\Users\王牛逼\Deskto......
  • 教你如何优雅地解决.sync语法糖不支持的问题!
    在Vue3中,.sync修饰符已经被移除。在Vue2中,.sync修饰符是一个语法糖,用于简化子组件和父组件之间的双向数据绑定。在Vue3中,推荐使用v-model或是自定义事件来实现类似的功能。以下是如何在Vue3中替代.sync的两种方法:使用v-model在Vue3中,v-model可以在自定义组......
  • 【MarkDown语法】
    @目录前言一、样式1.标题3.字体4.引用5.分割线6.图片7.超链接8.列表9.表格10.代码总结前言提示:这里可以添加本文要记录的大概内容:推荐文本编辑器:Typora文件后缀.md提示:以下是本篇文章正文内容,下面案例可供参考一、样式1.标题markdown语法中共有六级标题,分别对应......
  • markdown语法(部分)
    区别于快捷键 标题#标题几个井号几级标题1~6字体*内容*加粗两星斜体一星三星both删除~~content~~高亮==content==引用>空格分割线的三种方法:三个星号*加换行三个减号-加换行二级标题两个井号#图片![标题](地址)有序列......
  • Vue学习计划-Vue3--核心语法(六)路由
    1.路由【对路由的理解】【基本切换效果】Vue3中要使用vue-router的最新版本,目前是4版本路由配置文件代码如下://创建一个路由器,并暴露出去//第一步:引入createRouterimport{createRouter,createWebHistory}from'vue-router'//引入一个一个可能要呈现组件......
  • pg数据库和Oracle语法哪里有差异
    PostgreSQL(简称为PG)和Oracle是两种不同的关系型数据库管理系统,它们在语法和特性方面存在一些差异。以下是一些常见的差异:数据类型:两者支持的数据类型有一些差异,例如PostgreSQL支持数组类型和范围类型,而Oracle不支持。字符串引号:在PostgreSQL中,可以使用单引号或双引号表示字......