1+ import os
2+ import socket
3+ import multiprocessing
4+ from aiohttp import web
5+ from .main import create_app
6+ import uvloop
7+
8+ SERVERS_COUNT = multiprocessing .cpu_count ()
9+ BACKLOG = 2048
10+ SOCKET_BACKLOG = BACKLOG * SERVERS_COUNT
11+
12+ def start_server (sock , cpu_id ):
13+ if hasattr (os , "sched_setaffinity" ):
14+ os .sched_setaffinity (0 , {cpu_id })
15+ uvloop .install ()
16+ app = create_app ()
17+
18+ web .run_app (app , sock = sock , backlog = BACKLOG , access_log = None )
19+
20+
21+ def create_reusable_socket (host = '0.0.0.0' , port = 8080 ):
22+ sock = socket .socket (socket .AF_INET , socket .SOCK_STREAM )
23+ sock .setsockopt (socket .SOL_SOCKET , socket .SO_REUSEADDR , 1 )
24+ sock .setsockopt (socket .SOL_SOCKET , socket .SO_REUSEPORT , 1 )
25+ sock .setsockopt (socket .IPPROTO_TCP , socket .TCP_NODELAY , 1 )
26+
27+ sock .bind ((host , port ))
28+ sock .setblocking (False )
29+ sock .set_inheritable (True )
30+
31+ sock .listen (SOCKET_BACKLOG )
32+
33+ return sock
34+
35+
36+ if __name__ == '__main__' :
37+ sock = create_reusable_socket ()
38+ workers = []
39+ for cpu_id in range (SERVERS_COUNT ):
40+ worker = multiprocessing .Process (target = start_server , args = (sock , cpu_id ))
41+ worker .daemon = True
42+ worker .start ()
43+ workers .append (worker )
44+
45+ for worker in workers :
46+ worker .join ()
0 commit comments