Estoy tratando de codificar el servidor de socket con una bifurcación en python. de alguna manera, se creará una nueva bifurcación cuando se conecte un cliente y este proceso de bifurcación manejará la conexión, incluido el envío/recepción.
Ejecuté este script en Linux centOS y monitoreé los recursos con htop/top para ver cuántas bifurcaciones (tareas) se muestran. el problema es cuando elimino alguna bifurcación usando os._exit(0) htop no se cambiará (naturalmente, tiene que disminuirse eliminando las bifurcaciones) y cuando cierro el script de python todo volverá a la normalidad (uso de RAM y Tareas ).
Entonces, ¿qué tengo que hacer cuando elimino una bifurcación usando os._exit(0) , tiene un efecto en htop , por otro lado, libera todos los recursos y no espera hasta que se elimine su propio padre?
aquí está el código para crear bifurcaciones:
def test(sock): //handle socket then return for i in range (1000): sock,addr=socket.accept() pid=os.fork() if pid==0: test(sock) os._exit(0) elif pid !=-1: os.waitpid(-1, os.WNOHANG)El proceso padre necesita esperar al hijo para que se liberen los recursos del proceso hijo. Hasta entonces, el proceso aún existe en un estado "zombie", y seguirá apareciendo en ps y top , etc.
Puede llamar a uno de os.wait() , os.waitpid() , os.wait3() o os.wait4() .
os.wait3() con la opción os.WNOHANG podría ser más útil para usted, ya que esperará cualquier proceso secundario y el padre no se bloqueará hasta que finalice un hijo (o su estado cambie; la wait devolverá los procesos secundarios que se han detenido o reiniciado también).
Se pueden encontrar más detalles sobre las llamadas al sistema subyacente en la página del manual de Linux: man 2 wait .