|
@@ -0,0 +1,46 @@
|
|
|
+import os
|
|
|
+import socket
|
|
|
+import multiprocessing
|
|
|
+from aiohttp import web
|
|
|
+from .main import create_app
|
|
|
+import uvloop
|
|
|
+
|
|
|
+SERVERS_COUNT = multiprocessing.cpu_count()
|
|
|
+BACKLOG = 2048
|
|
|
+SOCKET_BACKLOG = BACKLOG * SERVERS_COUNT
|
|
|
+
|
|
|
+def start_server(sock, cpu_id):
|
|
|
+ if hasattr(os, "sched_setaffinity"):
|
|
|
+ os.sched_setaffinity(0, {cpu_id})
|
|
|
+ uvloop.install()
|
|
|
+ app = create_app()
|
|
|
+
|
|
|
+ web.run_app(app, sock=sock, backlog=BACKLOG, access_log=None)
|
|
|
+
|
|
|
+
|
|
|
+def create_reusable_socket(host='0.0.0.0', port=8080):
|
|
|
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
|
+ sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
|
+ sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
|
|
|
+ sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
|
|
|
+
|
|
|
+ sock.bind((host, port))
|
|
|
+ sock.setblocking(False)
|
|
|
+ sock.set_inheritable(True)
|
|
|
+
|
|
|
+ sock.listen(SOCKET_BACKLOG)
|
|
|
+
|
|
|
+ return sock
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == '__main__':
|
|
|
+ sock = create_reusable_socket()
|
|
|
+ workers = []
|
|
|
+ for cpu_id in range(SERVERS_COUNT):
|
|
|
+ worker = multiprocessing.Process(target=start_server, args=(sock, cpu_id))
|
|
|
+ worker.daemon = True
|
|
|
+ worker.start()
|
|
|
+ workers.append(worker)
|
|
|
+
|
|
|
+ for worker in workers:
|
|
|
+ worker.join()
|