Мне нужно было написать свою реализацию prefork сервера:
import os
import socket
class WebServer:
pids = []
def __init__(self, n_cpu, address, listeners, buffer, handler):
self.cpu_count = n_cpu
self.address = address
self.listeners = listeners
self.buffer = buffer
self.handler = handler
self.server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
def exec(self):
self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server.bind(self.address)
self.server.listen(self.listeners)
for i in range(self.cpu_count):
pid = os.fork()
if pid != 0:
self.pids.append(pid)
else:
print("Created worker PID: {}".format(os.getpid()))
while True:
client, client_addr = self.server.accept()
request = client.recv(self.buffer)
if len(request.strip()) == 0:
client.close()
continue
response = self.handler.handle(request)
client.send(response.build())
client.close()
self.server.close()
for pid in self.pids:
os.waitpid(pid, 0)
Также можете посмотреть на гитхабе:
https://github.com/kiryanenko/TP-Highload/tree/1.0
При AB тестировании обнаружил печальный факт, что с увеличением количества форкнутых процессов RPS падает:
n_cpu | RPS
-------------
1 | 3301
2 | 2140
3 | 1762
4 | 1709
Также программа при 1 процессе использует его на 100%, а при 2х и более использует их на 60%.
Никак не могу понять почему.