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

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. 锚点布局anchorlayout在kv中的引用

    from kivy.app import App from kivy.uix.anchorlayout import AnchorLayout from kivy.uix.button import ...

  2. [敏捷软工团队博客]Beta阶段发布声明

    项目 内容 2020春季计算机学院软件工程(罗杰 任健) 博客园班级博客 作业要求 Beta阶段发布声明 我们在这个课程的目标是 在团队合作中锻炼自己 这个作业在哪个具体方面帮助我们实现目标 对Bet ...

  3. BUAA SE 个人项目作业

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人项目作业 我在这个课程的目标是 通过个人项目实践熟悉个人开发流程 一.在文章开头给出教学班级和 ...

  4. Machine learning(2-Linear regression with one variable )

    1.Model representation Our Training Set [训练集]: We will start with this ''Housing price prediction'' ...

  5. 广域网(ppp协议、HDLC协议)

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105028759 学习课程:<2019王道考研计算机网络> 学习目的 ...

  6. 攻防世界 杂项 2.embarrass

    解1: linux环境下直接strings misc_02.pcapng | grep flag可得flag. 解2: 使用wireshark搜索flag. 解3: winhex搜索flag.

  7. objcopy使用

    objcopy - copy and translate object files:用于二进制文件的拷贝和翻译(转化) objcopy的man文件如下所示: objcopy [-F bfdname|- ...

  8. 第06课 OpenGL 纹理映射

    纹理映射: 在这一课里,我将教会你如何把纹理映射到立方体的六个面. 学习 texture map 纹理映射(贴图)有很多好处.比方说您想让一颗导弹飞过屏幕.根据前几课的知识,我们最可行的办法可能是很多 ...

  9. 攻防世界Web之fakebook

    打开题目,得到一个网页,包含一个表格.两个按钮. 习惯性先查看网页源码,但没发现有效信息. <!doctype html> <html lang="ko"> ...

  10. Qt 项目管理文件(.pro) 详解

    项目文件目录树 在 Qt Creator 中新建一个 Widget Application 项目 samp2_1,在选择窗口基类的页面选择 QWidget 作为窗体基类,并选中"Genera ...