异步操作 Redis

在通过 python 代码操作 redis 时,链接/操作/断开都是网络 IO。需要模块 aioredis

import asyncio
import aioredis


async def execute(address, password):
    print("开始执行:", address)

    # 网络Io操作,创建redis链接
    redis = await aioredis.create_redis(address, password=password)

    # 网络IO操作,遇到IO会自动切换任务
    await redis.hmset_dict('car', key=1, key2=2, key3=3)

    result = await redis.hgetall('car', encoding='utf-8')
    print(result)

    redis.close()
    await redis.wait_closed()

    print('结束:', address)


if __name__ == '__main__':
    tasks = [
        execute('redis://47.93.4.197:6379', 'root!qwe'),
        execute('redis://47.93.4.199:6379', 'root!qwe')
    ]
    asyncio.run(asyncio.wait(tasks))

异步操作 MySQL

基于 aiomysql

import asyncio
import aiomysql


async def execute(host="localhost", **kwargs):
    print("开始 mysql", host)

    conn = await aiomysql.connect(host, **kwargs)

    cur = await conn.cursor()

    await cur.execute("select Host,User from user")

    result = await cur.fetchall()
    print(result)

    await cur.close()
    conn.close()
    print('结束mysql', host)

if __name__ == '__main__':
    tasks = [
        execute('47.93.41.179', user='root', password='12qwe', db='mysql'),
        execute('47.93.41.199', user='root', password='12qwe', db='mysql')
    ]
    asyncio.run(asyncio.wait(tasks))

FastAPI 框架

FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示。

安装:

pip install fastapi
pip install uvicorn (asgi 内部基于 uvloop)

实现

import asyncio
import time
from typing import Optional

import uvicorn
import aioredis
from fastapi import FastAPI

app = FastAPI()

# 创建一个 redis链接池
REDIS_POOL = aioredis.ConnectionsPool('redis//127.0.0.1:6379', password='root:21',
                                      minsize=1, maxsize=10)

@app.get('/')
def index():
    # 普通操作接口
    print('开始请求 /')
    time.sleep(3)
    print('结束请求 /')
    return {'message': 'hello', 'status': '200'}


@app.get('/red')
async def red(status: Optional[int] = 1):
    # 异步操作接口

    print('请求参数:', status)

    await asyncio.sleep(3)
    # 链接池获取一个链接
    conn = await REDIS_POOL.acquire()
    redis = aioredis.Redis(conn)

    # 设置值, 并读取值
    await redis.hmset_dict('car', key=1, key2=2, key3=3)
    result = await redis.hgetall('car', encoding='utf-8')

    # 归换链接池
    REDIS_POOL.release(conn)

    print(f'处理完参数为 {status} 的请求')
    return result


if __name__ == '__main__':
    # main:main.py 文件(一个 Python "模块")。
    # app:在 main.py 文件中通过 app = FastAPI() 创建的对象。
    uvicorn.run('main:app', host="127.0.0.1", port=5000, log_level="info", debug=True)

爬虫

基于 aiohttp

import asyncio

import aiohttp


async def get_page(session, url):
    print('开始请求', url)

    async with session.get(url) as response:
        text = await response.text()
        print(f'{url} 结束--: {len(text)}')
        return text


async def main():
    async with aiohttp.ClientSession() as session:
        urls = [
            'https://www.bilibili.com/video/BV1Yh411o7Sz?p=100',
            'https://hcuan.top/',
            'https://hcuan.top/article/read?aid=2'
        ]
        tasks = [asyncio.create_task(get_page(session, url)) for url in urls]
        done = await asyncio.wait(tasks)


if __name__ == '__main__':
    asyncio.run(main())


相关推荐:

来自系列:多任务,异步

分类 python下文章:

1.0 爬虫的介绍,和requests模块的简单使用

1.1 数据解析的三种方式。正则表达式, bs4, xpath

2.0 多任务(进程,协程,线程)爬虫:验证码识别,返回头储存,ip代理 介绍。 异步是什么,爬虫异步的方式。线程,进程,介绍

2.0.1 协程的 async/await 实现 爬虫 单线程 + 异步协程的实现

3.0 基于selenium 模块的 爬虫操作。 selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。

更多...

评论([[comments.sum]])

发表

加载更多([[item.son.length-2]])...

发表

2020-11 By chuan.

Python-flask & bootstrap-flask

图片外链来自:fghrsh

互联网ICP备案号:蜀ICP备2020031846号