Znalazłem wiele podobnych pytań z pytaniem o rozmiar obiektu w czasie wykonywania w python. Niektóre z odpowiedzi sugerują ustawienie limitu pamięci podprocesu. Nie chcę ustawiać limitu pamięci dla podprocesów. Oto, czego chcę -Python - Limit ilości podprocesu danych.Popen może produkować
Używam subprocess.Popen()
do uruchomienia zewnętrznego programu. Mogę, bardzo dobrze, uzyskać standardowe wyjście i błąd z process.stdout.readlines()
i process.stderr.readlines()
po zakończeniu procesu.
Mam problem, gdy błędny program dostaje się do nieskończonej pętli i generuje wydruki. Ponieważ subprocess.Popen()
przechowuje dane wyjściowe w pamięci, ta nieskończona pętla szybko pochłania całą pamięć, a program zwalnia.
Jednym z rozwiązań jest to, że mogę uruchomić polecenie z limitem czasu. Ale ukończenie programów zajmuje dużo czasu. Duży czas oczekiwania na program, który zajmuje mało czasu i posiadający nieskończoną pętlę, pokonuje cel jego posiadania.
Czy istnieje prosty sposób, w którym można umieścić górny limit powiedzieć 200MB na ilość danych, które polecenie może produkować? Jeśli przekroczy limit, powinno zostać zabite.
Po zapełnieniu bufora potoku proces potomny nie zwalnia. Zatrzymuje się całkowicie, dopóki nie przeczytasz danych. Jeśli chcesz jednocześnie czytać więcej niż jedną potokę, możesz użyć wątków lub modułów 'select' lub' fcntl' do odczytu rur bez blokowania. – jfs