Я пытаюсь закодировать сервер сокета с fork в python. как-то новая вилка будет создана, когда клиент подключен, и этот процесс вилки будет обрабатывать соединение, включая send/receive.
Я запустил этот скрипт на Linux centOS
и просмотрел ресурсы с помощью htop/top
, чтобы увидеть, сколько вилок (задач) показано. проблема заключается в том, что я убиваю некоторые вилки с помощью os._exit(0)
. htop не будет изменен (естественно, его нужно уменьшить, убивая вилки), и когда я закрою скрипт python, все вернется к нормальной жизни (использование и задачи использования Ram).
, так что я должен сделать это, когда я убью какую-то вилку, используя os._exit(0)
, она воздействует на htop
в другой руке, освобождает все ресурсы и не дожидается, пока его собственный родитель не будет убит?
здесь это код для создания вилка:выход и очистка вилка python
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)
Я использовал 'os.waitpid (childPID, 0)' в родительском. но родительский интерфейс не принимает никакого соединения до тех пор, пока дочерний процесс не завершится и не выйдет. Но мне нужно, когда я использую 'os._exit (0)' в процессе fork, он исчезает в ps или top. в другой руке освободите все ресурсы. но теперь, если я создаю 1000 вилок и даже уничтожу их всех ('os._exit (0)'), кажется, что 'top или ps' по-прежнему показывает задачи = 1000. кажется, что вилка не была чистой или что-то в этом роде. но когда я завершаю процесс python и останавливаю каждый, тогда все будет хорошо. –
@MehrdadDadvand: родитель не будет принимать никаких подключений, потому что он заблокирован, ожидая завершения завершения. Вы можете запустить 'os.waitpid (childPID, os.WNOHANG)', и родительский элемент не будет блокироваться и будет возвращать '(0, return_code)', указывающий, что ребенок завершен, или (childPID, return_code), если он этого не сделал. Я упомянул 'os.wait3 (os.WNOHANG)' в своем ответе, который почти такой же, как 'os.waitpid (-1, os.WNOHANG), но он возвращает дополнительную информацию о ресурсе о ребенке, которая может быть полезна для регистрации в вашем родительском процессе. – mhawke
это работает. спасибо много –