请问这样的模型,用异步aysncio怎么写呢?

发布于 2022-09-06 12:24:25 字数 127 浏览 15 评论 0

a函数请求api,b函数请求api,a和b函数尽量同时发出请求。
a 和 b返回的结果扔给c函数去处理写入数据库!
a和b函数把结果给c的时候,马上又开始执行api请求!

这样的异步用asyncio要怎么写呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

顾铮苏瑾 2022-09-13 12:24:25
import time
import asyncio
from multiprocessing import Process, Queue
from concurrent.futures import ThreadPoolExecutor

async def api_a():
    await asyncio.sleep(2)
    return str(time.time())

async def api_b():
    await asyncio.sleep(3)
    return str(time.time())

class Test(object):
    def __init__(self):
        self._a = ''
        self._b = ''
        
    async def a(self):
        self._a = await api_a()
        
    async def b(self):
        self._b = await api_b()
def each_op(s):
    time.sleep(5)
    print('do some operation')
    print(s)
        
def db_op(q):
    start = time.time()
    with ThreadPoolExecutor(5) as executor:
        while 1:
            if not q.empty():
                s = q.get(True)
                if s is None:
                    print('no more api task')
                    break
                executor.submit(each_op, s)
    print('no more db task')        
    print('db time:', time.time()-start)
if __name__ == '__main__':
    start = time.time()
    t = Test()
    q = Queue()
    op = Process(target=db_op, args=(q,))
    op.start()
    loop = asyncio.get_event_loop()
    for _ in range(5):
        loop.run_until_complete(asyncio.wait([t.a(), t.b()]))
        q.put((t._a, t._b))
    loop.close()    
    q.put(None)
    print('api time:', time.time() - start)     

终端调用:

python3 test.py

结果:

do some operation
('1517222152.4486094', '1517222153.4516666')
do some operation
('1517222155.451781', '1517222156.4548383')
do some operation
('1517222158.4549527', '1517222159.4580102')
api time: 15.032859802246094
no more api task
do some operation
('1517222161.4581246', '1517222162.4611819')
do some operation
('1517222164.4612963', '1517222165.4643538')
no more db task
db time: 19.849135398864746
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文