• greenlet (早期:每一次都要人为的去指向下一个该执行的协程)
from greenlet import greenlet


def func1():
    print('func_1')
    gr2.switch()  # 2, 切换到 func2
    print('func_1-1')
    gr2.switch()  # 4, 切换为 func1


def func2():
    print('func_2')
    gr1.switch()  # 3, 切换为 func1 从上一次执行的位置继续执行
    print('func_2——2')


if __name__ == '__main__':
    gr1 = greenlet(func1)
    gr2 = greenlet(func2)

    gr1.switch()  # 1,

    # greenlet创建的的协程未完成时,主进程会等待协程结束

  • gevent (基于 greenlet :每次遇到 io 操作 需要耗时等待时,会自动跳到下一个协程继续执行)
from gevent import monkey
import gevent

monkey.patch_all()  # 猴子补丁


def func(val):
    print('open: ', val)
    gevent.sleep(2)
    print('over: ', val)


threads = [gevent.spawn(func, i) for i in range(10)]  # 创建协程

# grevent_obj.join()    # 等待协程结束(主进程不会等待)
g = gevent.joinall(threads)  # 可接多个参数

  • yield ( 在一个函数或者对象运行中,通过生成器暂停其运行 插入其他对象)
def func1():
    yield 1
    yield from func2()
    yield 2


def func2():
    yield 3
    yield 4


if __name__ == '__main__':
    f1 = func1()
    for i in f1:
        print(i)

  • asyncio (py3.4 装饰器实现, 3.8 已不支持装饰器实现)
import asyncio


@asyncio.coroutine
def func1():
    print(1)
    yield from asyncio.sleep(2)  # 遇到 IO耗时操作自动切换到 task中的其他任务
    print(2)


@asyncio.coroutine
def func2():
    print(1)
    yield from asyncio.sleep(2)  # 遇到耗时操作自动切换到 task中的其他任务
    print(2)


if __name__ == '__main__':
    tasks = [
        asyncio.ensure_future(func1()),
        asyncio.ensure_future(func2())
    ]

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

  • async, await (py3.5 推荐)
import asyncio


async def func1():
    print(1)
    await asyncio.sleep(2)  # 遇到 IO耗时操作自动切换到 task中的其他任务
    print(2)


async def func2():
    print(1)
    await asyncio.sleep(2)  # 遇到耗时操作自动切换到 task中的其他任务
    print(2)


async def main():
    print('另一种方式')
    task_s = [
        asyncio.create_task(func1()),
        asyncio.create_task(func2())
    ]
    await asyncio.wait(task_s)


if __name__ == '__main__':
    tasks = [
        asyncio.ensure_future(func1()),
        asyncio.ensure_future(func2())
    ]

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

    asyncio.run(main())


相关推荐:

来自系列:多任务,异步

分类 python下文章:

1.0 爬虫的介绍,和requests模块的简单使用

1.1 数据解析的三种方式。正则表达式, bs4, xpath

2.0 多任务(进程,协程,线程)爬虫:验证码识别,返回头储存,ip代理 介绍。 异步是什么,爬虫异步的方式。线程,进程,介绍

2.0.1 协程的 async/await 实现 爬虫 单线程 + 异步协程的实现

3.0 基于selenium 模块的 爬虫操作。 selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。

更多...

评论([[comments.sum]])

发表

加载更多([[item.son.length-2]])...

发表

2020-11 By chuan.

Python-flask & bootstrap-flask

图片外链来自:fghrsh

互联网ICP备案号:蜀ICP备2020031846号