Async/Await入门指南:https://zhuanlan.zhihu.com/p/27258289

import asyncio
import random


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


all_potatos = Potato.make(5)


async def ask_for_potato():
    await asyncio.sleep(random.random())
    all_potatos.extend(Potato.make(random.randint(1, 10)))


async def take_potatos(num):
    count = 0
    while True:
        if len(all_potatos) == 0:
            await ask_for_potato()
        potato = all_potatos.pop()
        yield potato
        count += 1
        if count == num:
            break


async def buy_potatos():
    bucket = []
    async for p in take_potatos(50):
        bucket.append(p)
        print(f'Got potato {id(p)}...')


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


all_tomatos = tomato.make(5)


async def ask_for_tomatos():
    await asyncio.sleep(random.random())
    all_tomatos.extend(Potato.make(random.randint(1, 10)))


async def take_tomatos(num):
    count = 0
    while True:
        if len(all_tomatos) == 0:
            await ask_for_tomatos()
        tomatos = all_tomatos.pop()
        yield tomatos
        count += 1
        if count == num:
            break


async def buy_tomatos():
    bucket = []
    async for p in take_tomatos(50):
        bucket.append(p)
        print(f'Got tomatos {id(p)}...')


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


main()