美文网首页
协程介绍

协程介绍

作者: IT的咸鱼 | 来源:发表于2018-11-01 18:22 被阅读0次

协程

  • 协程,又称微线程,纤程。英文名Coroutine。

1.协程是什么?

协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源)。 为啥说它是一个执行单元,因为它自带CPU寄存器上下文。这样只要在合适的时机, 我们可以把一个协程 切换到另一个协程。 只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的。

通俗的理解:在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再切换到原来的函数都由开发者自己确定

2.协程和线程差异

在实现多任务时, 线程切换从系统层面远不止保存和恢复 CPU上下文这么简单。 操作系统为了程序运行的高效性每个线程都有自己缓存Cache等等数据,操作系统还会帮你做这些数据的恢复操作。 所以线程的切换非常耗性能。但是协程的切换只是单纯的操作CPU的上下文,所以一秒钟切换个上百万次系统都抗的住。

yeild协程

import time
def work1():
    while True:
        print("----work1---")
        yield
        time.sleep(0.5)

def work2():
    while True:
        print("----work2---")
        yield
        time.sleep(0.5)

def main():
    w1 = work1()
    w2 = work2()
    while True:
        next(w1)
        next(w2)

if __name__ == "__main__":
    main()

实质: 其实任务是在主线程中并发执行的,看上去像同时执行而已,当执行next()的时候,函数执行到yield的时候先暂停一下,然后之后再调用next()的时候,接着上一次暂停的位置执行

greenlet协程

  • 为了更好使用协程来完成多任务,python中的greenlet模块对其封装,从而使得切换任务变的更加简单

1.安装方式sudo pip3 install greenlet

2.greenlet的使用

from greenlet import greenlet
import requests

def download1():
    print('正在下载1')
    #耗时的操作
    response = requests.get(url='https://github.com/')
    gre2.switch()
    print('download1下载完了')
    gre2.switch()
def download2():
    print('正在下载2')
    response = requests.get(url='https://github.com/')
    gre1.switch()
    print('download2下载完了')
gre1 = greenlet(download1)
gre2 = greenlet(download2)
gre1.switch()

执行结果

正在下载1
正在下载2
download1下载完了
download2下载完了

gevent协程

  • greenlet已经实现了协程,但是这个还的人工切换,是不是觉得太麻烦了,不要捉急,python还有一个比greenlet更强大的并且能够自动切换任务的模块gevent

其原理是当一个greenlet遇到IO(指的是input output 输入输出,比如网络、文件操作等)操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。

由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO

1.安装 pip3 install gevent
2.gevent的使用1

#gevent能够在内部自己实现携程之间的切换
import gevent

def f(n):
    for i in range(n):
        print(gevent.getcurrent(), i)
        #用来模拟一个耗时操作,注意不是time模块中的sleep
        gevent.sleep(1)

g1 = gevent.spawn(f, 5)
g2 = gevent.spawn(f, 5)
g3 = gevent.spawn(f, 5)
g1.join()
g2.join()
g3.join()

3.gevent的使用2

#gevent能够在内部自己实现携程之间的切换

from gevent import monkey,pool
import gevent,requests
import lxml.etree as etree

# 有耗时操作时需要
monkey.patch_all()  # 将程序中用到的耗时操作的代码,换为gevent中自己实现的模块


def download(url):
    print(url+'正在下载1')
    header = {'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0'}
    response = requests.get(url,headers=header)
    print(len(response.text),url+'已完成1')

def download2(url):
    print(url+'正在下载2')
    header = {'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0'}
    response = requests.get(url,headers=header)
    print(len(response.text),url+'已完成2')

pool = pool.Pool(2)

gevent.joinall(
    [
        pool.spawn(download,'https://www.yahoo.com/'),
        pool.spawn(download,'https://www.taobao.com/'),
        pool.spawn(download,'https://github.com/'), 
        pool.spawn(download2,'https://www.yahoo.com/'),
        pool.spawn(download2,'https://www.taobao.com/'),
        pool.spawn(download2,'https://github.com/'), 
    ]
)

相关文章

  • Kotlin 协程入门

    本文主要介绍协程长什么样子, 协程是什么东西, 协程挂起的实现原理以及整理了协程学习的资料. 协程 HelloWo...

  • 协程介绍

    协程 协程,又称微线程,纤程。英文名Coroutine。 1.协程是什么? 协程是python个中另外一种实现多任...

  • 协程原理:函数调用过程、参数和寄存器

    SRS是单进程、单线程、多协程结构,协程(coroutine)背景以后再介绍,这篇文章介绍协程的重要基础,理解了这...

  • Lua的协程和协程库详解

    我们首先介绍一下什么是协程、然后详细介绍一下coroutine库,然后介绍一下协程的简单用法,最后介绍一下协程的复...

  • 协程

    协程 1. 协程介绍 协程又称微线程,从名字可以看出,协程的粒度比线程更小,并且是用户管理和控制的,多个协程可以运...

  • Kotlin协程(1)协程介绍

      协程与线程类似,都可以处理并发任务。协程在很多语言中都支持,但 Java 中并没有协程,而 kotlin 中是...

  • Kotlin协程系列之基础设施

    前一篇文章介绍了kotlin协程的历史及现状,接下来就介绍一下kotlin协程吧。 kotlin协程分为标准库提供...

  • Kotlin协程实践 - HTTP页面内容异步下载示例

    协程相信大家都对协程这个词很有兴趣,网上也有大量介绍协程的文章,但是大多数都是介绍概念及理论的,很少看到有使用实际...

  • Kotlin中协程的使用

    官方介绍协程 协程定义 协程定义:kotlin官方基于JVM的线程实现的一个并发任务处理框架,封装的线程api 使...

  • 谁说Python协程是鸡肋的!站出来我不打死他!这么牛逼的协程!

    文章思路:本文将先介绍协程的概念,然后分别介绍Python2.x与3.x下协程的用法,最终将协程与多线程做比较并介...

网友评论

      本文标题:协程介绍

      本文链接:https://www.haomeiwen.com/subject/rhjwzftx.html