123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- import logging
- import asyncio
- import os
- import aiopg
- import jinja2
- import psycopg2.extras
- import asyncio_redis
- from asyncio_redis.protocol import HiRedisProtocol
- import aiohttp.web
- import aiohttp_jinja2
- import api_hour
- from . import endpoints
- LOG = logging.getLogger(__name__)
- class Container(api_hour.Container):
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- # Servers
- self.servers['http'] = aiohttp.web.Application(loop=kwargs['loop'])
- aiohttp_jinja2.setup(self.servers['http'], loader=jinja2.PackageLoader('hello'))
- self.servers['http'].ah_container = self # keep a reference to Container
- # routes
- self.servers['http'].router.add_route('GET', '/json', endpoints.world.json)
- self.servers['http'].router.add_route('GET', '/db', endpoints.world.db)
- self.servers['http'].router.add_route('GET', '/db_redis', endpoints.world.db_redis)
- self.servers['http'].router.add_route('GET', '/queries', endpoints.world.queries)
- self.servers['http'].router.add_route('GET', '/queries_redis', endpoints.world.queries_redis)
- self.servers['http'].router.add_route('GET', '/fortunes', endpoints.world.fortunes)
- self.servers['http'].router.add_route('GET', '/fortunes_redis', endpoints.world.fortunes_redis)
- self.servers['http'].router.add_route('GET', '/updates', endpoints.world.updates)
- self.servers['http'].router.add_route('GET', '/updates_redis', endpoints.world.updates_redis)
- self.servers['http'].router.add_route('GET', '/plaintext', endpoints.world.plaintext)
- def make_servers(self):
- return [self.servers['http'].make_handler(logger=self.worker.log,
- debug=False,
- keep_alive=0,
- access_log=None,
- access_log_format=self.worker.cfg.access_log_format)]
- @asyncio.coroutine
- def start(self):
- yield from super().start()
- LOG.info('Starting engines...')
- self.engines['pg'] = self.loop.create_task(aiopg.create_pool(host=os.environ.get('DBHOST', self.config['engines']['pg']['host']),
- port=int(self.config['engines']['pg']['port']),
- sslmode='disable',
- dbname=self.config['engines']['pg']['dbname'],
- user=self.config['engines']['pg']['user'],
- password=self.config['engines']['pg']['password'],
- cursor_factory=psycopg2.extras.RealDictCursor,
- minsize=int(self.config['engines']['pg']['minsize']),
- maxsize=int(self.config['engines']['pg']['maxsize']),
- loop=self.loop))
- yield from asyncio.wait([self.engines['pg']], return_when=asyncio.ALL_COMPLETED)
- self.engines['redis'] = yield from asyncio_redis.Pool.create(host=self.config['engines']['redis']['host'],
- port=self.config['engines']['redis']['port'],
- poolsize=self.config['engines']['redis']['poolsize'],
- loop=self.loop,
- protocol_class=HiRedisProtocol)
- LOG.info('All engines ready !')
- @asyncio.coroutine
- def stop(self):
- LOG.info('Stopping engines...')
- if 'pg' in self.engines:
- if self.engines['pg'].done():
- self.engines['pg'].result().terminate()
- yield from self.engines['pg'].result().wait_closed()
- else:
- yield from self.engines['pg'].cancel()
- if 'redis' in self.engines:
- self.engines['redis'].close()
- yield from asyncio.sleep(1) # wait redis close connection
- LOG.info('All engines stopped !')
- yield from super().stop()
|