协程是我们自己调度的
进程是系统调度的
协程切换很少开销

python3.5之前的实现方法

def yield_test():
"""实现协程函数"""
while True:
n = (yield)
print(n) if __name__ == "__main__":
rest = yield_test()
next(rest)
rest.send("666")
rest.send("666") 结果:
666
666

python3.6之后

例如当我们读文件的时候,文件比较大,读的时候可能会有阻塞,这时候我们使用await方法,让loop调用其他的协程,
等到读完之后再回来执行

import asyncio

async def do_sth(x):
"""定义协程函数"""
print("等待中{}".format(x))
await asyncio.sleep(x) #判断是否为协程函数
print(asyncio.iscoroutinefunction(do_sth)) coroutine = do_sth(5)
#事件循环队列
loop = asyncio.get_event_loop()
#注册任务
task = loop.create_task(coroutine)
print(task)
#等待协程任务执行结束
loop.run_until_complete(task)
print(task) 结果;
True
<Task pending coro=<do_sth() running at D:/PycharmProjects/untitled0406/test.py:4>>
等待中5
<Task finished coro=<do_sth() done, defined at D:/PycharmProjects/untitled0406/test.py:4> result=None>

执行过程

创建协程函数
获取事件循环队列
将协程函数加入到事件队列形成任务
等待协程任务执行结束

  

import asyncio

async def compute(x,y):
print("计算x + y => {0}+{1}".format(x,y))
await asyncio.sleep(3)
return x + y async def get_sum(x,y):
rest = await compute(x,y)
print("{0} + {1} = {2}".format(x,y,rest)) #拿到事件循环
loop = asyncio.get_event_loop()
loop.run_until_complete(get_sum(1,2))
loop.close() 结果:
计算x + y => 1+2
1 + 2 = 3

#定义一个队列
#让两个协程来进行通信
#让其中一个协程往队列中写数据
#让另一个协程从队列中删除数据
import asyncio
import random async def add(store,name):
"""
写入数据到队列
:param store: 队列的对象
:return:
"""
for i in range(5):
#往队列添加数字
num = "{0} - {1}".format(name,i)
await asyncio.sleep(random.randint(1, 5))
await store.put(i)
print("{2}add one ... {0},size:{1}".format(num,store.qsize(),name)) async def reduce(store):
"""
从队列中删除数据
:param store:
:return:
"""
for i in range(10):
rest = await store.get()
print("reduce one ....{0},size{1}".format(rest,store.qsize())) if __name__ == "__main__":
#准备队列
store = asyncio.Queue(maxsize=5)
a1 = add(store,"a1111")
a2 = add(store,"a2222")
r1 = reduce(store)
#添加事件队列
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(a1,a2,r1))
loop.close()

结果;

a2222add one ... a2222 - 0,size:1
reduce one ....0,size0
a1111add one ... a1111 - 0,size:1
reduce one ....0,size0
a2222add one ... a2222 - 1,size:1
reduce one ....1,size0
a1111add one ... a1111 - 1,size:1
reduce one ....1,size0
a1111add one ... a1111 - 2,size:1
reduce one ....2,size0
a2222add one ... a2222 - 2,size:1
a1111add one ... a1111 - 3,size:2
reduce one ....2,size1
reduce one ....3,size0
a1111add one ... a1111 - 4,size:1
reduce one ....4,size0
a2222add one ... a2222 - 3,size:1
reduce one ....3,size0
a2222add one ... a2222 - 4,size:1
reduce one ....4,size0

python18协程的更多相关文章

  1. python自动化 协程函数、二分查找、模块搜索

    协程函数 yiled: 把函数的执行结果封装好__iter__和__next__得到一个迭代器 与return功能类似,都可以返回值,但是return只能返回一次只 def fun(count): p ...

  2. Python(八)进程、线程、协程篇

    本章内容: 线程(线程锁.threading.Event.queue 队列.生产者消费者模型.自定义线程池) 进程(数据共享.进程池) 协程 线程 Threading用于提供线程相关的操作.线程是应用 ...

  3. Lua的协程和协程库详解

    我们首先介绍一下什么是协程.然后详细介绍一下coroutine库,然后介绍一下协程的简单用法,最后介绍一下协程的复杂用法. 一.协程是什么? (1)线程 首先复习一下多线程.我们都知道线程——Thre ...

  4. 协程--gevent模块(单线程高并发)

    先恶补一下知识点,上节回顾 上下文切换:当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据,程序指针等,最后才开始执行.这种 ...

  5. Python 【第五章】:线程、进程和协程

    Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import t ...

  6. 进击的Python【第十章】:Python的socket高级应用(多进程,协程与异步)

    Python的socket高级应用(多进程,协程与异步)

  7. unity 协程

    StartCoroutine在unity3d的帮助中叫做协程,意思就是启动一个辅助的线程. 在C#中直接有Thread这个线程,但是在unity中有些元素是不能操作的.这个时候可以使用协程来完成. 使 ...

  8. golang 裸写一个pool池控制协程的大小

    这几天深入的研究了一下golang 的协程,读了一个好文 http://mp.weixin.qq.com/s?__biz=MjM5OTcxMzE0MQ==&mid=2653369770& ...

  9. 从Erlang进程看协程思想

    从Erlang进程看协程思想 多核慢慢火了以后,协程类编程也开始越来越火了.比较有代表性的有Go的goroutine.Erlang的Erlang进程.Scala的actor.windows下的fibr ...

随机推荐

  1. GEOS使用记录

    由于需要计算GIS障碍物的缓冲区,所以研究了 一下GEOS库的使用,将使用的一些细节内容记录一下: 1.vs2010IDE无法编译较高版本的GEOS库,较高版本的库使用了更加高级的C++语法,如果想使 ...

  2. Python:Ubuntu上出现错误 Could not load dynamic library 'libnvinfer.so.6' / 'libnvinfer_plugin.so.6'

    运行一个py文件,出现如下的错误,原因是没有找到 libnvinfer.so.6 相关库的文件. 1 2021-01-04 18:41:17.324477: W tensorflow/stream_e ...

  3. 修改 oracle 数据库的 sys 账号密码,ERROR at line 1: ORA-01034: ORACLE not available

    挺久没有登录的 oracle 数据库,因为公司要求加固密码,登录后修改失败 1.启动数据库的同时启动控制文件.数据文件,提示:cannot mount database in EXCLUSIVE mo ...

  4. 【动图解释】关系数据库de关系代数小记

    本文章在 Github 撰写,同时在 我的博客 进行了发布. 最近学数据库概论学到了关系数据库的关系代数了.哎嘛,真的把我整晕了,尤其是关系代数的使用,很容易让人被蒙在鼓里. 对我来说槽点最大的莫过于 ...

  5. 【PowereDesigner】使用方法|mysql画图使用|不在跟新

    自己画E-R图时, 运行:Power Designer ..1 ..2 ..3 可以先放两个空的实体,然后,分别修改属性(鼠标右键,最后一项Properties),名称为:学生.课程. ..4 创建一 ...

  6. Linux 系统分区方案 详细教程

    简单分区方案 实际上,很多时候我们只需要分两个区:/和交换分区,日常使用基本不会有任何影响,甚至于交换分区对于现在的电脑来说都不是必要的,我们完全可以只分配一个根分区.linux只需要一个/根分区就可 ...

  7. msfsploit框架的使用——ms17_010漏洞的利用

    开门见山,首先输入msfconsole打开msf控制台 全球最牛逼的渗透测试框架就是长这个样子(每次打开时,显示的图案都不一样) 然后搜索ms17_010的相关模块,得到了六条结果,我们需要用的是编号 ...

  8. DDL数据定义语言

    DDL数据定义语言 (一)概述 DDL(Data Definition Language):数据定义语言,用来定义数据库对象,库.表.列等:创建.删除.修改 库,表结构.主要分为操作数据库的DDL和操 ...

  9. vue脚手架项目如何在控制台打印组件实例

    需要在浏览器上安装拓展程序vue开发工具,安装好后在控制台上输入$vm即可打印vue组件实例对象. Vue2.3开发工具都有,可自行下载 百度网盘链接提取码:si5l

  10. ant生成jmeter测试报告没有数据【已解决】

    1.如下图,在配置build时,到网上找配置文件,配置样式表文件名经常是jmeter-results-detail-report_21.xsl, 3.但是在其他版本可能被不是这个文件名,在jmeter ...