Python网络编程——协程

作者: techLee | 来源:发表于2018-06-24 19:55 被阅读946次

个人独立博客:www.limiao.tech
微信公众号:TechBoard


协程的概念

协程,又称微线程,纤程,也称用户级线程,在不开辟线程的基础上实现多任务,也就是在单线程的情况下完成多任务,多个任务按照一定顺序交替执行的,通俗理解只要在def里面只看到一个yield关键字表示就是协程

协程也是实现多任务的一种方式

协程yield的代码实现

简单实现协程

import time


# 定义协程
def work1():
    while True:
        print("work1...")
        time.sleep(1)
        yield

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


if __name__ == '__main__':
    g1 = work1()
    g2 = work2()
    while True:
        next(g1)
        next(g2)
实现协程的第二种方式:greenlet

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

首先使用pip安装greenlet模块:

pip3 install greenlet

greenlet的使用:

# greentlet的使用
import greenlet
import time


def work1():
    for i in range(10):
        print("work1")
        time.sleep(1)
        g2.switch()

def work2():
    for i in range(10):
        print("work2")
        time.sleep(1)
        g1.switch()
# 创建协程并指定任务
g1 = greenlet.greenlet(work1)
g2 = greenlet.greenlet(work2)

if __name__ == '__main__':
    g1.switch()

实现协程的第三种方式:gevent

greenlet已经实现了协程,但是这个还要人工切换,这里介绍一个比greenlet更强大而且能够自动切换任务的第三方库——gevent

gevent内部封装的greenlet,其原理是当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行

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

安装:

pip install gevent
gevent的使用
# gevent的使用
import gevent, time
from gevent import monkey

# gevent 遇到耗时操作(time, sleep, accept, recv, 网络请求)会切换到其他协程执行代码

# 打补丁,让gevent 能够识别耗时操作
monkey.patch_all()

# 任务1
def work1():
    for i in range(10):
        print("work1")
        # gevent.sleep(1)
        time.sleep(1)

def work2():
    for i in range(10):
        print("work2")
        # gevent.sleep(1)
        time.sleep(1)

if __name__ == '__main__':
    # 创建协程并指定执行的任务
    g1 = gevent.spawn(work1)
    g2 = gevent.spawn(work2)

    # 让主线程等待协程执行完成以后程序再退出
    g1.join()
    g2.join()

    # 注意点:如果程序一直运行,并且还有耗时操作,那么不需要使用join

个人独立博客:www.limiao.tech
微信公众号:TechBoard


相关文章

  • Python网络编程——协程

    个人独立博客:www.limiao.tech微信公众号:TechBoard 协程的概念 协程,又称微线程,纤程,也...

  • 36.Python并发编程之协程

    Python并发编程之协程 协程协程是程序级别的概念,操作系统根本就没有协程的概念!!!协程的本质就是一条线程,可...

  • Gevent高并发网络库精解

    进程 线程 协程 异步 并发编程(不是并行)目前有四种方式:多进程、多线程、协程和异步。 多进程编程在python...

  • python异步协程(aiohttp,asyncio)

    python异步协程 环境:python3.7.0 协程 协程,英文叫做 Coroutine,又称微线程,纤程,协...

  • Kotlin异步编程之协程

    其实,协程在编程语言中并不是什么新鲜概念。像 go, python 也有协程的概念,只不过 API 不尽相同。 为...

  • Python 异步:完整教程

    Asyncio 允许我们在 Python 中使用基于协程的并发异步编程。尽管 asyncio 已经在 Python...

  • python网络编程基础(连载)07 协程

    gitbook链接:用python带你进入AI中的深度学习技术领域https://www.gitbook.com/...

  • 协程(1)

    协程是什么 协程并不是 Kotlin 提出来的新概念,其他的一些编程语言,例如:Go、Python 等都可以在语言...

  • kotlin协程

    协程是什么 协程并不是 Kotlin 提出来的新概念,其他的一些编程语言,例如:Go、Python 等都可以在语言...

  • Python并发编程——协程

    摘要:Python,协程,gevent 协程基本概念 协程,又称微线程,纤程。英文名Coroutine,是Pyth...

网友评论

    本文标题:Python网络编程——协程

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