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

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

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

阅读 1.9k
1 个回答
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
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题