Python学习---Python的异步---asyncio模块(no-http)

Asyncio进行异步IO请求操作:

1. @asyncio.coroutine  装饰任务函数

2. 函数内配合yield from 和装饰器@asyncio.coroutine 配合使用【固定格式】

3. loop = asyncio.get_event_loop()

loop.run_until_complete(asyncio.gather(*tasks)) # 接受异步IO的任务并异步执行任务

实例一:

异步IO: 协程机制 + 回调函数

import asyncio

@asyncio.coroutine  # 装饰任务函数
def func1():
    print(‘before...func1......‘)
    # yield from 和装饰器@asyncio.coroutine 配合使用【固定格式】
    yield from asyncio.sleep(5)  # 必须写asyncio才表示异步IO执行5秒,time.sleep(5)不生效
    print(‘5秒后...‘)
    print(‘end...func1......‘)

tasks = [func1(), func1()]
# 事件循环: 对涉及异步,协成,阻塞等IO操作时进行事件的循环操作
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(*tasks)) # 接受异步IO的任务并异步执行任务
loop.close()

AsyncIO缺点:

不支持HTTP请求,也就是说不能直接发送URL过去进行访问

支持TCP请求,也就是说可以发送【IP+端】进行访问

注:HTTP在TCP之上

基于asyncio实现利用TCP模拟HTTP请求

import asyncio
# 基于asyncio实现利用TCP模拟HTTP请求[asyncio实际上不支持HTTP请求]
@asyncio.coroutine
def fetch_async(host, url=‘/‘):
    print(‘HOST和URL信息:‘, host, url)
    # reader: 用于读取连接的信息
    # writer: 用于给服务器写信息
    reader, writer = yield from asyncio.open_connection(host, 80)
    # 基于TCP模拟的HTTP请求:请求头header和请求体body之间是2空行【\r\n\r\n】分隔的
    request_header_content = """GET %s HTTP/1.0\r\nHost: %s\r\n\r\n""" % (url, host,)
    request_header_content = bytes(request_header_content, encoding=‘utf-8‘) # 字符串转换字节

    writer.write(request_header_content) # 准备发送数据给服务器
    # drain: 英文翻译为喝光,这里作发送完成理解
    yield from writer.drain() # 发送数据给服务器,此时可能会阻塞执行个请求,考虑数据量大等原因
    text = yield from reader.read() # 等待返回的数据,text就是先收到回复的请求完成后等待其他返回
    print(host,url,‘返回后的结果:‘, text)
    writer.close() # 关闭流

tasks = [
    fetch_async(‘www.cnblogs.com‘, ‘/ftl1012/‘),
    fetch_async(‘www.dig.chouti.com‘, ‘/images/homepage_download.png‘)
]

loop = asyncio.get_event_loop()
results = loop.run_until_complete(asyncio.gather(*tasks))
loop.close()

基于TCP模拟HTTP详解:

原文地址:https://www.cnblogs.com/ftl1012/p/9424748.html

时间: 2024-08-01 01:28:39

Python学习---Python的异步---asyncio模块(no-http)的相关文章

Python学习---IO的异步[asyncio +aiohttp模块]

aiohttp aiohttp是在asyncio模块基础上封装的一个支持HTTP请求的模块,内容比8.4.2[基于asyncio实现利用TCP模拟HTTP请求]更全面 安装aiohttp: pip3 install aiohttp asyncio + aiohttp实现异步请求[有问题] import aiohttp import asyncio @asyncio.coroutine def fetch_async(url): print(url) response = yield from a

Python学习---IO的异步[twisted模块]

安装twisted模块 Linux: pip3 install twisted Window: a. http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted, 下载:Twisted-17.1.0-cp35-cp35m-win_amd64.whl b. 进入文件所在目录 c. pip3 install Twisted-17.1.0-cp35-cp35m-win_amd64.whl Twisted实例[小有问题] from twisted.web.cli

Python学习---Python的异步IO[all]

1.1.1. 前期环境准备和基础知识 安装: pip3 install aiohttp pip3 install grequests pip3 install wheel pip3 install scrapy 注意: windows上scrapy依赖 https://sourceforge.net/projects/pywin32/files/ 安装Twisted a. http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted, b. 下载:Twis

Python学习系列(六)(模块)

一,模块的基本介绍 1,import引入其他标准模块 标准库:Python标准安装包里的模块. 引入模块的几种方式: i)引入模块:import   moduleName ii)引入模块下的函数:from moduleName import function1,function2,-- iii)引入模块下的所有函数:from moduleName import * 使用模块里的函数的方法: moduleName.function(agrs) 示例: >>> import math >

python学习第四十八天json模块与pickle模块差异

在开发过程中,字符串和python数据类型进行转换,下面比较python学习第四十八天json模块与pickle模块差异. json 的优点和缺点 优点  跨语言,体积小 缺点 只能支持 int str list tuple dict pickle 的优点和缺点 优点 专门为python设计,支持python所有的数据类型 缺点 只能python使用,存储数据占空间大 文章来自 www.96net.com.cn 原文地址:https://www.cnblogs.com/96net/p/97806

Python学习之路13?常用模块

一 time模块 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行"type(time.time())",返回的是float类型. 格式化的时间字符串(Format String) 结构化的时间(struct_time):struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时) 1 import time 2 #

Python 学习入门(35)—— 模块

模块简介 python是由一系列的模块组成的,每个模块就是一个py为后缀的文件,同时模块也是一个命名空间,从而避免了变量名称冲突的问题.模块我们就可以理解为lib库,如果需要使用某个模块中的函数或对象,则要导入这个模块才可以使用,除了系统默认的模块(内置函数)不需要导入外. 导入直接使用如下语法:  import 模块名称 (不要.py后缀) 这样导入成功后,就可以在另外一个模块中使用被导入模块的功能函数或对象. 举例如下,比如在F:\Pro-files\workspace\myPython目录

Python学习系列----第五章 模块

5.1 如何引入模块 在Python中用关键字import来引入某个模块,比如要引用模块math,就可以在文件最开始的地方用import math来引入.在调用math模块中的函数时,必须这样引用: 模块名.函数名 有时候我们只需要用到模块中的某个函数,只需要引入该函数即可,此时可以通过语句 from 模块名 import 函数名1,函数名2.... 5.2 如何定义自己的模块 在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字. 比如有这样一个文件test.py

Python学习—基础篇之常用模块

常用模块 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块. python常用模块主要有: 1. time模块 2. random模块 3. hashlib模块 4. os模块 5. sys模块 6. logging模块 7. 序列化模块 8. configpar

python学习笔记--Win7安装paramiko模块

在安装软件的过程中,一定要找对正确的安装方法,之前找了很多解决问题的方法,但是发现大多数的方法都不对,浪费了时间,问题也很难解决. 文章借鉴 http://www.cnblogs.com/saneri/p/5715661.html 1.首先下载PyCrypto for Python  根据自己的python版本选择对应的PyCrypto,下载默认安装即可. 地址为: http://www.voidspace.org.uk/python/modules.shtml#pycrypto 2.下载安装e