IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 同步到异步小案例 -> 正文阅读

[Python知识库]同步到异步小案例

同步:超市有5个土豆,而我想买50个土豆

from time import sleep


class Potato:
    @classmethod
    def make(cls, num, *args, **kws):
        potatos = []
        for i in range(num):
            potatos.append(cls.__new__(cls, *args, **kws))
        return potatos

#创建超市列表,放5个土豆
all_potatos = Potato.make(5)


def take_potatos(num):
    count = 0
    while True:
        #判断有无土豆,没有就等待
        if len(all_potatos) == 0:
            sleep(.1)
        else:
            #有就删除一个,即在bucket篮子里加入一个
            potato = all_potatos.pop()
            yield potato
            count += 1
            #当土豆数买够数量就停
            if count == num:
                break

#买土豆
def buy_potatos():
    bucket = []
    for p in take_potatos(50):
        bucket.append(p)
        print(bucket)

buy_potatos()

上述结局由于是同步的就是只能一直等,因为超市只有5个,而我想买50个,没买够只能等

异步:买土豆

import asyncio
import random
from time import sleep

class Potato:
    @classmethod
    def make(cls, num, *args, **kws):
        potatos = []
        for i in range(num):
            potatos.append(cls.__new__(cls, *args, **kws))
        return potatos


#创建超市列表,放5个土豆
all_potatos = Potato.make(5)


#异步买土豆
async def take_potatos(num):
    count = 0
    while True:
        #判断有无土豆,没有就等待
        if len(all_potatos) == 0:
            #等待超市采购土豆
            await ask_potatos()
        else:
            #有就删除一个,即在bucket篮子里加入一个
            potato = all_potatos.pop()
            yield potato
            count += 1
            #当土豆数买够数量就停
            if count == num:
                break

#超市去买土豆存货,放到超市列表
async def ask_potatos():
    await asyncio.sleep(random.random())
    all_potatos.extend(Potato.make(random.randint(1, 10)))

#买土豆
async def buy_potatos():
    bucket = []
    number = 0
    async for p in take_potatos(50):
        bucket.append(p)
        print('买编号为 %d,第%d个土豆'%(id(p),number+1))
        number+=1

def main():
    import asyncio
    loop = asyncio.get_event_loop()
    res = loop.run_until_complete(buy_potatos())
    loop.close()

main()

?超市土豆不够了就异步去别的地方采购土豆,我等超市采购完土豆(当生产者完成和返回之后,这是便能从await挂起的地方继续往下跑,完成消费的过程。),然后我再买土豆,买够五十个就停了

因为是异步,所以我们也可以在超市采购土豆的时候,去干别的(如买西红柿)

import asyncio
import random
from time import sleep

class Potato:
    @classmethod
    def make(cls, num, *args, **kws):
        potatos = []
        for i in range(num):
            potatos.append(cls.__new__(cls, *args, **kws))
        return potatos


#创建超市列表,放5个土豆
all_potatos = Potato.make(5)

class Tomatos:
    @classmethod
    def make(cls, num, *args, **kws):
        tomatos = []
        for i in range(num):
            tomatos.append(cls.__new__(cls, *args, **kws))
        return tomatos


#创建超市列表,放10个西红柿
all_tomatos = Tomatos.make(10)


#异步买土豆
async def take_potatos(num):
    count = 0
    while True:
        #判断有无土豆,没有就等待
        if len(all_potatos) == 0:
            await ask_potatos()
        else:
            #有就删除一个,即在bucket篮子里加入一个
            potato = all_potatos.pop()
            yield potato
            count += 1
            #当土豆数买够数量就停
            if count == num:
                break

#异步买西红柿
async def take_tomatos(num):
    count = 0
    while True:
        #判断有无西红柿,没有就等待
        if len(all_tomatos) == 0:
            await ask_tomatos()
        else:
            #有就删除一个,即在bucket篮子里加入一个
            tomato = all_tomatos.pop()
            yield tomato
            count += 1
            #当西红柿数买够数量就停
            if count == num:
                break


#超市去买土豆存货,放到超市列表
async def ask_potatos():
    await asyncio.sleep(random.random())
    all_potatos.extend(Potato.make(random.randint(1, 10)))


# 超市去买西红柿存货,放到超市列表
async def ask_tomatos():
    await asyncio.sleep(random.random())
    all_tomatos.extend(Tomatos.make(random.randint(1, 10)))

#买土豆
async def buy_potatos():
    bucket = []
    number = 0
    async for p in take_potatos(50):
        bucket.append(p)
        print('买编号为 %d,第%d个土豆'%(id(p),number+1))
        number+=1
async def buy_tomatos():
    bucket = []
    number = 0
    async for p in take_tomatos(50):
        bucket.append(p)
        print('买编号为 %d,第%d个西红柿' % (id(p), number + 1))
        number += 1

def main():
    import asyncio
    loop = asyncio.get_event_loop()
    res = loop.run_until_complete(asyncio.wait([buy_potatos(),buy_tomatos()]))
    loop.close()

main()

如图:

?

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-03-13 21:44:46  更:2022-03-13 21:46:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 21:22:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码