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

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. netty入门实现简单的echo程序

    最近看以往在程序中编写的代码,发现有一个功能是使用socket通讯来实现的,而那个时候使用的是基于bio的阻塞io来实现的,最近在看netty,发现可以使用netty来使用nio的方式来实现,此博客记 ...

  2. The entitlements specified in your application’s Code Signing Entitlements file do not match those s

    今天给打包 TPshop IOS (搜豹商城) ipa文件 调试运行 xcode运行提示这个错误: The entitlements specified in your application's C ...

  3. Codeforces Round #747 (Div. 2)题解

    谢天谢地,还好没掉分,还加了8分,(8分再小也是加啊)前期刚开始有点卡,不过在尽力的调整状态之后,还是顺利的将前面的水题过完了,剩下的E2和F题就过不去了,估计是能力问题,自己还是得认真补题啦. E2 ...

  4. linux 内核源代码情景分析——Intel X86 CPU 系列的寻址方式

    当我们说一个CPU是"16位"或"32"位时,指的是处理器中"算数逻辑单元"(ALU)的宽度.数据总线通常与ALU具有相同的宽度.当Inte ...

  5. mongoDB 的一般使用

    理解 mongodb 也是nosql 的一种.他的数据存储类型是一种和json格式比较像的数据类型,可以看作就是json. mongodb 里的数据库都是一个单独的库.一般需要用的库都会设置自己的us ...

  6. shell 脚本二进制安装mysql

    以下脚本的手动安装连接:https://www.cnblogs.com/leihongnu/p/12581793.html [ #/bin/bash#脚本安装 mysql,上传安装包至 /rootcd ...

  7. 记一次,因表变量导致SQL执行效率变慢

    场景 最近工作中,发现某同步JOB在执行中经常抛出SQL执行超时的问题,查看日志发现每次SQL执行的时间都是线性增长的,循环执行50次以后执行时间甚至超过了5分钟 JOB执行流程分析  首先,对于JO ...

  8. k8s入坑之路(14)scheduler调度 kubelet管理及健康检查 更新策略

    kubelet 主要功能 Pod 管理 在 kubernetes 的设计中,最基本的管理单位是 pod,而不是 container.pod 是 kubernetes 在容器上的一层封装,由一组运行在同 ...

  9. 解决create-react-app 后 npm start or yarn start 中出现 的webpack版本问题

    解决create-react-app 后 npm start or yarn start 中出现 的webpack版本问题 错误提示信息 There might be a problem with t ...

  10. python -m参数

    把模块当做脚本运行,标准库和第三方库都可以 会把当前路径添加到sys.path中