python网络爬虫之协程的实现方法

 更新时间:2023年08月09日 11:37:07   作者:小维_  
这篇文章主要介绍了python网络爬虫之协程的实现方法,协程Coroutine又称微线程,是一种用户态内的上下文切换技术,简而言之,就是通过一个线程实现代码块相互切换执行,需要的朋友可以参考下

1.协程

协程(Coroutine):又称微线程,是一种用户态内的上下文切换技术。

简而言之,就是通过一个线程实现代码块相互切换执行。

意义:在一个线程中如果遇到IO等待时间,线程不会傻傻等,会在空闲的时间再干其他事情。

一个线程,可以认为是人为的控制线程在函数之间进行线程切换,且仅有一个线程来完成切换。

实现协程的方法

  • greenlet 早期模块
  • yield关键字  yield是python中的生成器
  • asyncio装饰器(py3.4)
  • async、await关键字(py3.5)【推荐】

1.1greenlet实现协程

安装:

pip install greenlet

# 1. greenlet实现协程
from greenlet import greenlet
def func1():
    print(1)    #第二步:输出1
    gr2.swith()     #第三步:切换到func2函数
    print(2)    #第六步:输出2
def func2():
    print(3)    #第四步:输出3
    gr1.switch()    #第五步:切换到func1函数
    print(4)    #第七步:输出4
gr1 = greenlet(func1())
gr2 = greenlet(func2())
gr1.switch()    #第一步:执行func1函数

1.2 yield关键字实现协程

# 2. yield关键字 实现协程
def func1():    #如果一个函数中,存在yield关键字,则认为是一个生成器,则执行该函数,就生成一个生成器
    yield 1     #第二步:输出1
    yield from func2()  #第三步:表示跳到func2函数中
    yield 2     #第六步:输出2
def func2():
    yield 3     #第四步:输出3
    yield 4     #第五步:输出4
f1 = func1()
for item in f1:
    print(item) #第一步:执行func1函数

1.3 asyncio 实现协程

# 3. asyncio 实现协程【无需安装,但要求python需3.4及以上版本】
# 注意:遇到IO阻塞自动切换
import asyncio
@asyncio.coroutine
def func1():    #func1位普通函数,添加了asynic.coroutine装饰器后,则认为该函数为协程函数
    print(1)
    yield  from asyncio.sleep(2)  # 遇到IO耗时操作,自动切换到tasks中的其他任务
    print(2)
@asyncio.coroutine
def func2():
    print(3)
    yield  from asyncio.sleep(2)    # 遇到IO耗时操作,自动切换到tasks中的其他任务
    print(4)
#协程函数的执行, 则无法使用func1()方法进行执行,需要以下的方法进行执行
# loop = asyncio.get_event_loop()
# loop.run_until_complete(函数名称)  #使用以上代码,执行函数的协程操作 如:loop.run_until_complete(func())
#对func1和func2函数进行封装, 然后使用下面的4句代码,在pyhton内部,同时会执行这两个协程函数,线程会随机执行所有函数中的一个
tasks = [
    asyncio.ensure_future(func1()),
    asyncio.ensure_future(func2())
]
# 线程函数会随机执行func1和func2协程函数
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

假设首先执行func1函数,则在遇到 yield from asyncio.sleep(2),线程会跳转到其他协程函数中,但因为该python文件中仅有2个协程函数,

#因此,跳转执行func2函数,而在func2函数中遇到yield from asyncio.sleep(2),就又会跳转到func1函数冲,输出2,最后再到func2函数中,输出4.结束本次操作

#本代码输出结果为: 1 3 2 4

1.4 asyn &await 实现协程

# 4. async & await关键字【推荐】  在python3.5及以上
import asyncio
async def func1():    #func1位普通函数,添加了asynic.coroutine装饰器后,则认为该函数为协程函数
        print(1)
        await asyncio.sleep(2)  # 遇到IO耗时操作,自动切换到tasks中的其他任务
        print(2)
@asyncio.coroutine
async def func2():
        print(3)
        await asyncio.sleep(2)    # 遇到IO耗时操作,自动切换到tasks中的其他任务
        print(4)
#对func1和func2函数进行封装, 然后使用下面的4句代码,在pyhton内部,同时会执行这两个协程函数,线程会随机执行所有函数中的一个
tasks = [
    asyncio.ensure_future(func1()),
    asyncio.ensure_future(func2())
]
# 线程函数会随机执行func1和func2协程函数
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

#说明:asyncio和 async & await区别不大,只是将@asyncio.coroutine替换为 asyn ;将yield from 替成 await,其他的都没变

到此这篇关于python网络爬虫之协程的实现方法的文章就介绍到这了,更多相关python网络爬虫之协程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • anaconda的安装和配置环境及导入pycharm的方法

    anaconda的安装和配置环境及导入pycharm的方法

    这篇文章主要介绍了anaconda的安装和配置环境及导入pycharm的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Python中glob库实现文件名的匹配

    Python中glob库实现文件名的匹配

    本文主要主要介绍了Python中glob库实现文件名的匹配,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • 6个Python办公黑科技,助你提升工作效率

    6个Python办公黑科技,助你提升工作效率

    这篇文章主要介绍了Python办公黑科技,文中有非常详细的代码示例,对正在学习python的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-08-08
  • 在VSCode中搭建Python开发环境并进行调试

    在VSCode中搭建Python开发环境并进行调试

    这篇文章介绍了在VSCode中搭建Python开发环境并进行调试的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • python使用线程封装的一个简单定时器类实例

    python使用线程封装的一个简单定时器类实例

    这篇文章主要介绍了python使用线程封装的一个简单定时器类,实例分析了Python线程的使用及定时器类的实现技巧,需要的朋友可以参考下
    2015-05-05
  • python2和python3在处理字符串上的区别详解

    python2和python3在处理字符串上的区别详解

    这篇文章主要介绍了python2和python3在处理字符串上的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • 如何使用 Python为你的在线会议创建一个假的摄像头

    如何使用 Python为你的在线会议创建一个假的摄像头

    这篇文章主要介绍了使用 Python为你的在线会议创建一个假的摄像头,在 Python 的帮助下,不再强制开启摄像头,将向你展示如何为你的在线会议创建一个假的摄像头,需要的朋友可以参考下
    2022-08-08
  • pytorch实现逻辑回归

    pytorch实现逻辑回归

    这篇文章主要为大家详细介绍了pytorch实现逻辑回归,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • Django中模板的继承及引用实现

    Django中模板的继承及引用实现

    Django模版引擎中最强大也是最复杂的部分就是模版继承了,页面的代码很多,随随便便就是几百行代码,但是每个页面之中都有相同的元素。本文主要介绍了Django模板的继承及引用,感兴趣的可以了解一下
    2021-08-08
  • 基于Python自制视觉桌上冰球小游戏

    基于Python自制视觉桌上冰球小游戏

    这篇文章主要和大家分享一下如何使用 mediapipe+opencv 制作桌上冰球的交互式小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-04-04

最新评论