协程的概念

协程,又称微线程,纤程,也称用户级线程,在不开辟线程的基础上实现多任务,也就是在单线程的情况下完成多任务,多个任务按照一定顺序交替执行的,通俗理解只要在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

```

python网络编程库_Python网络编程——协程相关推荐

  1. python网络编程库_python网络编程学习笔记(9):数据库客户端

    一.DB-API概述 python支持很多不同的数据库.由于不同的卖家服务器导致和数据库通信的网络协议各有不同.在python的早期版本中,每一种数据库都带有自己的python模块,所有这些模块以不同 ...

  2. python抓包库_python 网络抓包

    Python下的网络抓包库pylibpcap.pypcap.pycap这些库其实这些都是libpcap的Python绑定实现,libpcap才是真正的核心. pypcap 目前pypcap和pylib ...

  3. python模块介绍-gevent介绍:基于协程的网络库

    2019独角兽企业重金招聘Python工程师标准>>> python模块介绍-gevent介绍:基于协程的网络库 介绍 gevent是基于协程的Python网络库.特点: 基于lib ...

  4. python 函数式编程 库_使用Python的toolz库开始函数式编程的方法

    在这个由两部分组成的系列文章的第二部分中,我们将继续探索如何将函数式编程方法中的好想法引入到 Python中,以实现两全其美. 在上一篇文章中,我们介绍了不可变数据结构 . 这些数据结构使得我们可以编 ...

  5. Python 爬虫:单线程、多线程和协程的爬虫性能对比

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以点击下方链接自行获取 Python免费学习资料 ...

  6. Python爬虫:单线程、多线程和协程的爬虫性能对比!

    大家好,我是漆柒七7! 首先见面礼 Python学习大礼包 点击领取 然后今天我要给大家分享的是如何爬取豆瓣上深圳近期即将上映的电影影讯,并分别用普通的单线程.多线程和协程来爬取,从而对比单线程.多线 ...

  7. Python爬虫:单线程、多线程和协程的爬虫性能对比

    今天我要给大家分享的是如何爬取豆瓣上深圳近期即将上映的电影影讯,并分别用普通的单线程.多线程和协程来爬取,从而对比单线程.多线程和协程在网络爬虫中的性能. 具体要爬的网址是:https://movie ...

  8. Python爬虫:单线程、多线程和协程的爬虫性能对比!异步才是永远滴神!

    然后今天我要给大家分享的是如何爬取豆瓣上深圳近期即将上映的电影影讯,并分别用普通的单线程.多线程和协程来爬取,从而对比单线程.多线程和协程在网络爬虫中的性能. 具体要爬的网址是:https://mov ...

  9. python多线程好还是多协程好_深入浅析python中的多进程、多线程、协程

    进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. ...

最新文章

  1. 且看BCH开启的“信用本位”时代
  2. 局域网实现VLAN实例
  3. mysql 主键 uniqo_项目总结,彻底掌握NodeJS中如何使用Sequelize
  4. 本文中的问题直接重装mysql即可,但是注意数据也会一并消失
  5. How to judge if one OData model data is out of date
  6. 逻辑斯蒂回归_逻辑斯蒂回归详细解析 | 统计学习方法学习笔记 | 数据分析 | 机器学习...
  7. esp8266单片机透传_基于WeMos D1(ESP8266)的校园卡门禁系统
  8. 51nod 1412
  9. QUIC协议学习记录
  10. 如何实现两台Domino之间的相互访问
  11. 2020美赛F奖论文(一):摘要、绪论和模型准备
  12. kasp技术原理_KASP 2x PCR Mix 说明书
  13. deb文件如何安装(安装文件管理器)
  14. layui日期插件用法
  15. 上海庆科EMW3162 WiFi模块 串口透传
  16. 寒假每日一题——拖拉机
  17. Java中Switch选择语句的用法
  18. J.J. Abrams的神秘电影 amp; 一个解谜网站
  19. 如何重新设置苹果id密码_苹果怎么重新设置id账号和密码
  20. oracle透明加密部署及场景使用

热门文章

  1. mysql大事务导致系统变慢_MySQL因大事务导致的Insert慢实例分析
  2. word文档如何画线条流程图_如何将Word文档拆分成多个文件?
  3. 查看linux java home_查看Linux中自带的jdk,设置JAVA_HOME
  4. go语言学习,channel消费者和生产者
  5. eax ax ah al
  6. 线程并发与进程并发各有什么you_操作系统问答题总结
  7. 那个软件弹出广告_如何关闭烦人的电脑弹窗广告?5种方法教你轻松解决
  8. android 代码打开权限,android开发权限询问的示例代码
  9. cpu的主频主要影响微型计算机的,在微型计算机中,通常用主频来描述CPU的(1);对计算机磁盘工作影响最小的因 - 问答库...
  10. java系统架构图设计,先收藏了