Skip to content

Commit 30572ab

Browse files
committed
event loop and server optimizations
1 parent dd3258c commit 30572ab

File tree

6 files changed

+61
-30
lines changed

6 files changed

+61
-30
lines changed

main.py

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,23 @@
11
#!/usr/bin/env python3
2-
import materialized_view_updater
2+
import uvloop
3+
4+
uvloop.install()
5+
36
from proxy_py import settings
47
from processor import Processor
58
from server.proxy_provider_server import ProxyProviderServer
69
from statistics import statistics
710
from checkers.base_checker import BaseChecker
11+
from tools import test_collector
812

13+
import materialized_view_updater
914
import asyncio
1015
import logging
1116
import argparse
17+
import subprocess
18+
import sys
19+
1220

13-
from tools import test_collector
1421

1522
test_collector_path = None
1623
main_logger = None
@@ -84,32 +91,24 @@ def prepare_loggers():
8491
main_logger.addHandler(logger_file_handler)
8592

8693

87-
def main():
94+
async def core():
95+
8896
process_cmd_arguments()
8997
prepare_loggers()
9098

91-
loop = asyncio.get_event_loop()
92-
9399
if test_collector_path is not None:
94-
return loop.run_until_complete(test_collector.run(test_collector_path))
100+
return await test_collector.run(test_collector_path)
95101

96102
proxy_processor = Processor.get_instance()
97103

98-
proxy_provider_server = ProxyProviderServer(
99-
settings.PROXY_PROVIDER_SERVER_ADDRESS['HOST'],
100-
settings.PROXY_PROVIDER_SERVER_ADDRESS['PORT'],
101-
proxy_processor,
102-
)
103-
104-
loop.run_until_complete(proxy_provider_server.start(loop))
105-
106104
try:
107-
loop.run_until_complete(asyncio.gather(*[
105+
code = await asyncio.gather(*[
108106
proxy_processor.worker(),
109107
statistics.worker(),
110108
materialized_view_updater.worker(),
111-
]))
109+
])
112110
BaseChecker.clean()
111+
return code
113112
except KeyboardInterrupt:
114113
pass
115114
except BaseException as ex:
@@ -120,5 +119,31 @@ def main():
120119
return 0
121120

122121

122+
def server():
123+
proxy_provider_server = ProxyProviderServer(
124+
settings.PROXY_PROVIDER_SERVER_ADDRESS['HOST'],
125+
settings.PROXY_PROVIDER_SERVER_ADDRESS['PORT'],
126+
)
127+
128+
return proxy_provider_server.start(asyncio.get_event_loop())
129+
130+
131+
def main():
132+
if len(sys.argv) < 2:
133+
# run default configuration
134+
p = subprocess.Popen(["python", sys.argv[0], 'server'])
135+
136+
code = asyncio.get_event_loop().run_until_complete(core())
137+
p.wait()
138+
return code
139+
140+
command = sys.argv[1].strip()
141+
sys.argv = sys.argv[1:]
142+
return {
143+
'core': lambda: asyncio.get_event_loop().run_until_complete(core()),
144+
'server': server,
145+
}[command]()
146+
147+
123148
if __name__ == "__main__":
124149
exit(main())

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ py_mini_racer
1212
pytest
1313
pytest-asyncio
1414
termcolor
15+
uvloop

server/api_v1/api_request_handler.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ async def handle(self, request: aiohttp.ClientRequest, post_data: dict):
4242
ex
4343
)
4444
)
45+
self.app.log_exception(request, ex)
4546

4647
response = {
4748
'status': 'error',

server/api_v1/requests_to_models/request_executor.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import peewee_async
2+
13
from proxy_py import settings
24
from models import db
35
from ..requests_to_models.request import Request, GetRequest, CountRequest, FetchRequest

server/base_app.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ def log_critical(self, *args, **kwargs):
3737
def log_error(self, *args, **kwargs):
3838
self.log('error', *args, **kwargs)
3939

40+
def log_exception(self, *args, **kwargs):
41+
self.log('exception', *args, **kwargs)
42+
4043
def log_warning(self, *args, **kwargs):
4144
self.log('warning', *args, **kwargs)
4245

@@ -47,15 +50,11 @@ def log_debug(self, *args, **kwargs):
4750
self.log('debug', *args, **kwargs)
4851

4952
def log(self, level, request, message):
50-
if False and settings.DEBUG:
51-
client_host, client_port = request.transport.get_extra_info("peername")
52-
client_ip = "{}:{}".format(client_host, client_port)
53-
else:
54-
# behind nginx or other reverse proxy
55-
client_ip = str(request.headers.get("X-Real-IP", "None"))
56-
57-
if client_ip == "None" or client_ip.startswith("127.0.0.1"):
58-
self.logger.error("Your reverse proxy doesn't present user's IP", extra={"client_ip": client_ip})
53+
# behind nginx or other reverse proxy
54+
client_ip = str(request.headers.get("X-Real-IP", "None"))
55+
56+
if client_ip == "None" or client_ip.startswith("127.0.0.1"):
57+
self.logger.error("Your reverse proxy doesn't present user's IP", extra={"client_ip": client_ip})
5958

6059
getattr(self.logger, level)(message, extra={
6160
"client_ip": client_ip,

server/proxy_provider_server.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import asyncio
2+
13
from proxy_py import settings
24
from .base_app import BaseApp
35
from .api_v1.app import App as ApiV1App
@@ -12,7 +14,7 @@
1214

1315

1416
class ProxyProviderServer(BaseApp):
15-
def __init__(self, host, port, processor):
17+
def __init__(self, host, port):
1618
logger = logging.getLogger("proxy_py/server")
1719

1820
if settings.DEBUG:
@@ -30,21 +32,22 @@ def __init__(self, host, port, processor):
3032

3133
super(ProxyProviderServer, self).__init__(logger)
3234

33-
self._processor = processor
3435
self.host = host
3536
self.port = port
3637
self._request_number = 0
3738

38-
async def start(self, loop):
39-
await self.init()
39+
def start(self, loop):
40+
loop.run_until_complete(self.init())
4041

42+
'''
4143
server = await loop.create_server(
4244
self._app.make_handler(),
4345
self.host,
4446
self.port
4547
)
48+
'''
4649

47-
return server
50+
return web.run_app(self._app, host=self.host, port=self.port, loop=loop)
4851

4952
async def setup_router(self):
5053
api_v1_app = ApiV1App(logger=self.logger)

0 commit comments

Comments
 (0)