python模块Asynico提供了管理事件、携程、任务和线程的功能已经编写并发代码的同步原语。

组成模块:

事件循,Asyncio 每个进程都有一个事件循环。

协程,子例程概念的泛化,可以暂停任务,等待哇爱不处理程序完成再从暂停之处返回。

Futures:定义了futures对象。

任务tasks:是Asyncio的一个子类,用于封装并管理并行模式下的协程。

管理事件循环的方法:

loop = asyncio.get_event_loop()  获得当前上下文事件循环
loop.call_later(time_delay,caallback,argument) 在给定时间time_delay秒后,调用某个回调对象。
loop.call_soon(callback,argument) 该方法马上安排一个被调用的回调对象。
loop.time() 以浮点数形式返回根据事件循环的内部时钟确定的当前时间。
asyncio.set_event_loop() 将当前上下文的时间循环设置为3给定循环。
asyncio.new_event_loop() 根据此函数的规则创建并返回一个新的时间循环对象。
loop.run_forever() 一直执行知道调用stop()为止。 异步调用子例程
import asyncio

def fun_1(end_time,loop):
print("fun1__callback") if (loop.time() + 1.0) < end_time:
loop.call_later(1,fun_2,end_time,loop)
print("fun1print")
else:
loop.stop() def fun_2(end_time, loop):
print("fun2__callback") if (loop.time() + 1.0) < end_time:
loop.call_later(1, fun_3, end_time, loop) else:
loop.stop() def fun_3(end_time, loop):
print("fun3__callback") if (loop.time() + 1.0) < end_time:
loop.call_later(1, fun_1, end_time, loop) else:
loop.stop() loop = asyncio.get_event_loop() end_loop = loop.time() + 9.0 loop.call_soon(fun_1,end_loop,loop) loop.run_forever() loop.close() 结果:
fun1__callback
fun1print
fun2__callback
fun3__callback
fun1__callback
fun1print
fun2__callback
fun3__callback
fun1__callback
fun1print
fun2__callback
fun3__callback

从输出结果上我们可以看到这个任务调用是完全异步的,开始loop.call_soon(fun_1,end_loop,loop) 立刻调用fun_1 当if条件成立时延迟一秒执行fun_2 但是fun_1的下一句print依然直接输出。但是我后来又测试他实际上还是要等fun_1里的其他语句执行完才会切换到fun_2。

总结:只是在fun_1 1S后调用fun_2期间他会执行fun_1中的其他语句,但是如果需要的时间过长就会等待fun_1所有语句执行完毕才会切换到fun_2不仅仅等一秒。

使用Asyncio处理协程

与子例程相似但是不存在用于协调结果的主程序,协程之间可以相互连接形成一个管道,不需要任何监督函数来按顺序调用协程。谢承忠可以暂停执行,同时保存干预时的本地状态,便于后续继续执行任务。有了协程池,协程计算就能够相互交错。

特点:

协程支持多个进入点,可以多次生成。

协程能够将执行转移至任意其他协程。

下方实现了一个有限状态机。

如图:系统有5个状态 ,start 、s1、s2、s3、end

这里s1-s3是自动循环切换。开始通过start进入状态机从end退出状态机。

实现代码如下

import asyncio
import time
from random import randint @asyncio.coroutine
def StartState():
print("start state call \n")
input_value = randint(0,1)
time.sleep(1)
if (input_value == 0):
result = yield from start1(input_value)
else:
result = yield from start2(input_value)
print("start + " + result)
return result
@asyncio.coroutine
def start1(value):
v = str(value)
input_value = randint(0,1)
if input_value == 0:
result = yield from start2(input_value)
else:
result = yield from start3(input_value) print("1 end +" + result)
return v @asyncio.coroutine
def start2(value):
v = str(value)
input_value = randint(0, 1)
if input_value == 0:
result = yield from start1(input_value)
else:
result = yield from start3(input_value) print("2 end +" + result)
return v @asyncio.coroutine
def start3(value):
v = str(value)
input_value = randint(0, 1)
if input_value == 0:
result = yield from endy(input_value)
else:
result = yield from start1(input_value) print("3 end +"+ result)
return v @asyncio.coroutine
def endy(value):
v = str(value)
print("end +" +v )
return v
if __name__ == "__main__": print("开始")
loop = asyncio.get_event_loop()
loop.run_until_complete(StartState())

是否切换下一个状态由input_value决定,而他是由python的random模块中的randint(0,1)函数定义的。该函数随机返回值0或1.通过这种方法,可以随机决定有限状态机被传递哪个状态。

利用Asyncio 并发协程
Asyncio提供了一个处理任务计算的方法,asynico.Task(coroutine).该方法用于调度协程的执行,任务负责执行时间循环中的协程对象。一个事件循环只执行一个任务,也就是添加进Task中的每个任务都通过线程并发处理。
import asyncio

@asyncio.coroutine
def task1(number):
f =
for i in range(number):
f += i
print("task1 + %d" % i)
yield from asyncio.sleep()
print("task1 the end number =%d" % f) @asyncio.coroutine
def task2(number):
f =
for i in range(number):
f *= i
print("task2 * %d" % i)
yield from asyncio.sleep() print("task2 the end number = %d" % f) @asyncio.coroutine
def task3(number):
f =
for i in range(number):
f -= i
print("task2 - %d" % i)
yield from asyncio.sleep() print("task2 the end number = %d" % f) if __name__ == "__main__":
tasks = [asyncio.Task(task1()),
asyncio.Task(task2()),
asyncio.Task(task3())
]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks)) #wait 等协程结束后返回
loop.close() 输出结果:
task1 +
task2 *
task2 -
task1 +
task2 *
task2 -
task1 +
task2 *
task2 -
task1 +
task2 *
task2 -
task1 +
task2 *
task2 -
task1 +
task2 *
task2 -
task1 +
task2 *
task2 -
task1 +
task2 *
task2 -
task1 +
task2 *
task2 -
task1 +
task2 *
task2 -
task1 the end number =
task2 the end number =
task2 the end number = -

使用Asyncio和Futures

future = asyncio.Future()
future.cancel() 取消future,并安排回调函数。
future.result() 返回future锁代表的结果
future.exception() 返回fture上设置的异常
future.add_done_callback() 添加一个在future执行时运行的回调函数
future.remove_done_callback() 从借宿后调用列表中溢出一个回调对象的所有实例
future.set_result() 将future标记为已完成并设置其结果
future.set_exception() 将future标记为已完成,并设置一个异常
import asyncio

@asyncio.coroutine
def firest_coroutine(future):
count =
for i in range():
count += i yield from asyncio.sleep()
future.set_result("first corountine sum %d" % count) @asyncio.coroutine
def second_coroutine(future):
count =
for i in range(,):
count *= i yield from asyncio.sleep()
future.set_result("second corountine sum %d" % count) def callback_result(future):
print(future.result()) if __name__ == "__main__":
loop = asyncio.get_event_loop()
future1 = asyncio.Future()
future2 = asyncio.Future() tasks = [
firest_coroutine(future1),
second_coroutine(future2)
] future1.add_done_callback(callback_result)
future2.add_done_callback(callback_result) loop.run_until_complete(asyncio.wait(tasks))
loop.close()

总结一下:主要就是通过线程和协程 实现的事件编程,通过不同事件不同状态的调用,最后这段代码主要是添加了事件中可回调对象的操作。

												

python:Asyncio模块处理“事件循环”中的异步进程和并发执行任务的更多相关文章

  1. python——asyncio模块实现协程、异步编程

    我们都知道,现在的服务器开发对于IO调度的优先级控制权已经不再依靠系统,都希望采用协程的方式实现高效的并发任务,如js.lua等在异步协程方面都做的很强大. Python在3.4版本也加入了协程的概念 ...

  2. Python 协程与事件循环

    Table of Contents 前言 协程 async & await 事件循环 asyncio 的事件循环 结语 参考链接 前言 Python 标准库 asyncio 是我目前接触过的最 ...

  3. python之模块copy_reg(在python3中为copyreg,功能基本不变)

    # -*- coding: utf-8 -*-#python 27#xiaodeng#python之模块copy_reg(在python3中为copyreg,功能基本不变) import copy_r ...

  4. 简单的node爬虫练手,循环中的异步转同步

    简单的node爬虫练手,循环中的异步转同步 转载:https://blog.csdn.net/qq_24504525/article/details/77856989 看到网上一些基于node做的爬虫 ...

  5. Python进阶----计算机基础知识(操作系统多道技术),进程概念, 并发概念,并行概念,多进程实现

    Python进阶----计算机基础知识(操作系统多道技术),进程概念, 并发概念,并行概念,多进程实现 一丶进程基础知识 什么是程序: ​   程序就是一堆文件 什么是进程: ​   进程就是一个正在 ...

  6. Python asyncio 模块

    Python 3.4 asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持. asyncio的编程模型就是一个消息循环.我们从asyncio模块中直接获取一个EventLo ...

  7. Python - Asyncio模块实现的生产消费者模型

    [原创]转载请注明作者Johnthegreat和本文链接 在设计模式中,生产消费者模型占有非常重要的地位,这个模型在现实世界中也有很多有意思的对应场景,比如做包子的人和吃包子的人,当两者速度不匹配时, ...

  8. libuv事件循环中的三种句柄

    1.说明 本文会简单介绍 libuv 的事件循环,旨在入门级别的使用,而不做深入探究,简单来说就是,会大概用就行,先用熟练了,再去探究原理和源码 下图为官网的 libuv 的不同部分及其涉及的子系统的 ...

  9. for循环中进行联网请求数据、for循环中进行异步数据操作,数据排序错乱问题解决;

    for循环中进行联网请求数据,由于网络请求是异步的,第一个网络请求还没有回调,第二次第三次以及后续的网络请求又已经发出去了,有可能后续的网络请求会先回调:这时我们接收到的数据的排序就会错乱:怎么才能让 ...

随机推荐

  1. restapi(8)- restapi-sql:用户自主的服务

    学习函数式编程初衷是看到自己熟悉的oop编程语言和sql数据库在现代商业社会中前景暗淡,准备完全放弃windows技术栈转到分布式大数据技术领域的.但是在现实中理想总是不如人意,本来想在一个规模较小的 ...

  2. 一次PHP代码上线遇到的问题

    exception ‘CDbException’ with message ‘The table “pms_goods” for active record class “PmsGoods” cann ...

  3. 利用X-Forwarded-For伪造客户端IP漏洞成因及防范

    内容转载自叉叉哥https://blog.csdn.net/xiao__gui/article/details/83054462 问题背景 在Web应用开发中,经常会需要获取客户端IP地址.一个典型的 ...

  4. TCP Socket服务端客户端(二)

    本文服务端客户端封装代码转自https://blog.csdn.net/zhujunxxxxx/article/details/44258719,并作了简单的修改. 1)服务端 此类主要处理服务端相关 ...

  5. MongoDB系列---用户及权限管理02

    MongoDB-——Privilege 学习大纲: 1.用户权限管理 2.用户操作 知识回顾:  本系列上一篇博文我们讲述了如何搭建环境以及配置我们的MongoDB,通过搭建环境后我们又学习了如何通过 ...

  6. SpringCloud之Hystrix断路器(六)

    整合Hystrix order-service pom.xml         <dependency> <groupId>org.springframework.cloud& ...

  7. Python中的is和==的区别

    Python中的is和==的区别 1. is 是比较内存地址id() a = "YongJie" b = "YongJie" print(id(a)) #233 ...

  8. Mongoose 基本用法

    1. SchemaTypes数据类型 数据类型 描述 String 字符串 Number 数字 Date 日期 Boolean 布尔值 Mixed 混合 Objectid 对象ID Array 数组 ...

  9. Security整合spring boot

    Security整合spring boot 1.基础概念 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spri ...

  10. c#中关于string的特性介绍以及注意事项

    前言 string类型在我们实际项目开发中是一个最使用的类型,string是一个引用类型这一点大家都知道,但是在实际使用过程中,大家会发现string和我们常见的引用类型使用还真不一样,看下面的一个简 ...