server.py 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import os
  2. import socket
  3. import multiprocessing
  4. from aiohttp import web
  5. from .main import create_app
  6. import uvloop
  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. uvloop.install()
  14. app = create_app()
  15. web.run_app(app, sock=sock, backlog=BACKLOG, access_log=None)
  16. def create_reusable_socket(host='0.0.0.0', port=8080):
  17. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  18. sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  19. sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
  20. sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
  21. sock.bind((host, port))
  22. sock.setblocking(False)
  23. sock.set_inheritable(True)
  24. sock.listen(SOCKET_BACKLOG)
  25. return sock
  26. if __name__ == '__main__':
  27. sock = create_reusable_socket()
  28. workers = []
  29. for cpu_id in range(SERVERS_COUNT):
  30. worker = multiprocessing.Process(target=start_server, args=(sock, cpu_id))
  31. worker.daemon = True
  32. worker.start()
  33. workers.append(worker)
  34. for worker in workers:
  35. worker.join()