暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

协程异步方式请求API接口

codefan 2019-02-27
784

协程异步方式请求API接口

  1. __author__ = 'chengxinyao'

  2. import asyncio

  3. import asyncio.queues as queue

  4. import aiohttp

  5. """

  6. python3.6

  7. asyncio aiohttp 协程异步方式 请求api接口

  8. """

  9. class AsyncCheckApi(object):

  10. def __init__(self,urls,worker_nums):

  11. self.urls = urls

  12. self.worker_nums = worker_nums

  13. self.q = queue.Queue()

  14. async def producer(self,url):#url放进队列

  15. await self.q.put(url)

  16. async def consumer(self):#消费队列+回调异步请求

  17. try:

  18. url = await self.q.get()

  19. print(url)

  20. response = await self.request(url)

  21. #其他异步函数继续

  22. print(response)

  23. finally:

  24. self.q.task_done()

  25. async def request(self,url):#异步请求函数

  26. response = None

  27. try:

  28. async with aiohttp.ClientSession() as session:

  29. async with session.get(url) as resp:

  30. response = await resp.json()

  31. except Exception as e:

  32. print('url:{} 请求异常{}'.format(url,e))

  33. finally:

  34. return response

  35. async def worker(self):#回调消费者函数

  36. while not self.q.empty():

  37. await self.consumer()

  38. async def run(self):#调度函数 生产队列/消费队列

  39. for url in self.urls:

  40. await self.producer(url)

  41. for num in range(self.worker_nums):

  42. await self.worker()

  43. await self.q.join()

  44. def main(urls,worker_nums):

  45. obj = AsyncCheckApi(urls,worker_nums)

  46. loop = asyncio.get_event_loop()

  47. loop.run_until_complete(obj.run())

  48. if __name__ == '__main__':

  49. base_url = ' http://*****/api/v1?func_name='

  50. func_names = ['get_com_users', 'get_activate_users', 'get_invoice_num', 'get_efficiency',

  51. 'get_company_economic_tops',

  52. 'get_industry_social_tops', 'get_user_distribution_province', 'get_user_distribution_city',

  53. 'get_environment_contribution', 'get_bw_cloud_contribution', 'get_compliance_inspection_num',

  54. 'get_tax_risk_intelligence_num', 'get_detected_tax_risks_num', 'get_tax_income_rate',

  55. 'get_tax_costs_amount_rate',

  56. 'get_tax_bear_area', 'get_tax_bear_area_tops', 'get_tax_bearing_rate', 'get_tax_night',

  57. 'get_ecological_com_tops',

  58. 'get_drift_contribution', 'get_xh_gh_sales', 'get_e_drift_heat', 'get_e_drift_source_target'

  59. ]

  60. urls = [base_url + i for i in func_names]

  61. worker_nums = 10 #起多少worker消费队列里数据

  62. main(urls,worker_nums)

  63. """

  64. 输出内容

  65. http://*****/api/v1?func_name=get_com_users

  66. {'data': {'get_com_users': 81000}, 'msg': '获取数据成功', 'success': True}

  67. http://*****/api/v1?func_name=get_activate_users

  68. {'data': {'get_activate_users': 23786}, 'msg': '获取数据成功', 'success': True}

  69. http://*****/api/v1?func_name=get_invoice_num

  70. {'data': {'get_invoice_num': 800000000}, 'msg': '获取数据成功', 'success': True}

  71. :::

  72. """


文章转载自codefan,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论