server.py 1.3 KB

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