Python 异步协程函数原理及实例详解

yipeiwu_com7年前Python基础

这篇文章主要介绍了Python 异步协程函数原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、 asyncio

1.python3.4开始引入标准库之中,内置对异步io的支持

2.asyncio本身是一个消息循环

3.步骤:

(1)创建消息循环

(2)把协程导入

(3)关闭

4.举例:

import threading
# 引入异步io包
import asyncio
# 使用协程
@ asyncio.coroutine
def hello():
	print("Hello World!(%s)" % threading.current_thread())
print("Start......(%s)" % threading.current_thread())
yield from asyncio.sleep(5)
print("Done.....(%s)" % threading.current_thread())
print("Hello again!(%s)" % threading.current_thread())
# 启动消息循环
loop = asyncio.get_event_loop()
# 定义任务
tasks = [hello(), hello()]
# asyncio使用wait等待task执行完毕
loop.run_until_complete(asyncio.wait(
	tasks))
# 关闭消息循环
loop.close()

二、asyncio and await

1.为了更好的表示异步io

2.python3.5引入

3.让协程代码更加简洁

4.使用上,可以简单的进行替换

(1)用async来替换@asyncio,coroutine

(2)用await来替换yield from

按照上面这个语法可以来改写前面的例子,运行结果是完全一致的

三、aiohttp

1.asyncio实现单线程的并发io,在客户端用处不大

2.在服务端可以asyncio+coroutine配合,因为http是io操作

3.asyncio实现了tcp,udp,ssl等协议

4.aiohttp是基于asyncio实现的http框架

5.例子:

import asyncio
from aiohttp
import web
​
async def index(request):
	await asyncio.sleep(0.5)
return web.Response(body = b "<h1>Index</h1>")
​
async def hello(request):
	await asyncio.sleep(0.5)
text = "<h1>hello,%s!</h1>" % request.match_info[
	"name"]
return web.Response(body = text.encode(
	"utf-8"))
​
async def init(loop):
	app = web.Application(loop = loop)
app.router.add_route("GET", "/", index)
app.router.add_route("GET",
	"/hellp/{name}", hello)
srv = await loop.create_server(app.make_handler(),
	"127.0.0.1", 8000)
print(
	"Server started at http://127.0.0.1:8000..."
)
return srv
​
loop = asyncio.get_event_loop()
loop.run_until_complete(init(loop))
loop.run_forever()

四、current,futures

1. python3新增的库

2.类似其它语言的线程池的概念

3.利用multiprocessing实现真正的并行计算(当然要求我们的CPU是多核的)

4.核心原理:以子进程的形式,实现多个python解释器

从而令python程序,可以利用多核CPU来提升执行速度。由于子进程于主解释器相分离,所以他们的全局解释器锁也是相互独立的,每个子进程都能完整的使用一个CPU内核

5.concurrent.futures.Executor

(1)ThreadPoolExecutor

(2)ProcessPoolExecutor

(3)执行的时候需要自行选择

(4)submit(fn,args,kwargs)

fn:异步执行的函数

args,kwargs参数

import time
from concurrent.futures
import ThreadPoolExecutor
​
def return_future(msg):
	time.sleep(3)
return msg
​
# 创建一个线程池
pool = ThreadPoolExecutor(max_workers =
	2)# 参数是2, 代表里面有两个线程干活
# 往线程池里面加入两个task
f1 = pool.submit(return_future, "hello")
f2 = pool.submit(return_future, "world")
time.sleep(1)
# 等待执行完毕
print(f1.done())
time.sleep(3)
print(f2.done())
# 结果
print(f1.result())
print(f2.result())

源码

d28_1_asynchronization_examples.py

https://github.com/ruigege66/Python_learning/blob/master/d28_1_asynchronization_examples.py

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持【听图阁-专注于Python设计】。

相关文章

Python Unittest根据不同测试环境跳过用例的方法

Python Unittest根据不同测试环境跳过用例的方法

前言 在利用单元测试框架执行测试用例的过程中,有时只需要执行一部分用例,或者跳过某些暂不需要执行的用例,python的unittest框架就内置这样的功能。 本文章会讲述以下几个内容:...

利用QT写一个极简单的图形化Python闹钟程序

今天我们讲一下用Python写的GUI小程序。一个小闹钟(只是屏幕提示,没有声音哦) 让我们先介绍这个闹钟如何奇葩。 需要通过命令行启动。 没有标题栏。 没菜单。 甚至没有关闭按钮。 没...

基于python 字符编码的理解

一、字符编码简史: 美国:1963年 ASCII (包含127个字符  占1个字节) 中国:1980年 GB2312 (收录7445个汉字,包括6763个汉字和682个其它符号...

Python多线程及其基本使用方法实例分析

本文实例讲述了Python多线程及其基本使用方法。分享给大家供大家参考,具体如下: 学习Python的多线程(Multi-threading),至少应该要有进程与线程的基本概念,可以参考...

基于python脚本实现软件的注册功能(机器码+注册码机制)

一、前言: 目的:完成已有python图像处理工具的注册功能 功能:用户运行程序后,通过文件自动检测认证状态,如果未经认证,就需要注册。注册过程是用户将程序运行后显示的机器码(C盘的卷序...