Почему мой скрипт на python случайно убивается? - PullRequest
13 голосов
/ 28 ноября 2009

По сути, у меня есть список из 30000 URL. Скрипт просматривает URL-адреса и загружает их (с задержкой в ​​3 секунды). И затем он сохраняет HTML в базе данных.

И это петли и петли ...

Почему это случайно получает "убито"? Я ничего не трогал.

Редактировать: это происходит на 3 из моих Linux-машин. Машины находятся в облаке Rackspace с 256 МБ памяти. Больше ничего не работает.

Ответы [ 5 ]

19 голосов
/ 28 ноября 2009

Похоже, что у вас не хватает памяти - это может легко произойти в долго работающей программе, если у вас есть "утечка" (например, из-за накопления циклических ссылок). Предлагает ли Rackspace какие-либо легко используемые инструменты для отслеживания памяти процесса, чтобы вы могли проверить, так ли это? В противном случае, за такими вещами нетрудно следить с помощью обычных инструментов Linux извне. Как только вы определили, что «нехватка памяти» является вероятной причиной смерти, специфичные для Python инструменты, такие как pympler , могут помочь вам точно определить причину проблемы (и таким образом определить, как избежать этих ссылок - будь то замена их на слабые ссылки или другие более простые подходы - или иным образом устранение утечек).

16 голосов
/ 28 ноября 2009

В подобных случаях вам следует проверить файлы журналов.

Я использую Debian и Ubuntu, поэтому основной файл журнала для меня: /var/log/syslog

Если вы используете Red Hat, я думаю, что журнал: /var/log/messages

Если что-то случится так же исключительно, как ядро, убивающее ваш процесс, будет событием журнала, объясняющим это.

Я подозреваю, что вас убивает Убийца нехватки памяти .

1 голос
/ 28 ноября 2009

Используете ли вы какой-нибудь менеджер очередей или какой-то другой менеджер процессов? Я получил, по-видимому, случайно убитые сообщения, когда используемый мной диспетчер очереди пакетов отправлял SIGUSR2, когда время истекло.

В противном случае я настоятельно рекомендую опцию «Недостаточно памяти».

1 голос
/ 28 ноября 2009

Возможно ли, что оно попадает в неисследованное исключение? Вы запускаете это из оболочки, или это запускается из cron или каким-то другим автоматическим способом? Если это автоматизировано, вывод может не отображаться нигде.

0 голосов
/ 16 декабря 2016

Для тех, кто пришел сюда с mysql, я нашел эти ответы полезными:

используйте SSCursor как предложено this

conn = MySQLdb.connect(host=DB_HOST, user=DB_USER, db=DB_NAME,
                       passwd=DB_PASSWORD, charset="utf8",
                       cursorclass=MySQLdb.cursors.SSCursor)

и выполнить итерацию курсора в соответствии с this

cursor = conn.cursor()
cursor.execute("select * from very_big_table;")    
for row in cur:
    # do what you want here
    pass

Обратите внимание на то, что документ говорит You MUST retrieve the entire result set and close() the cursor before additional queries can be peformed on the connection., поэтому, если вы хотите написать и в то же время, вам следует использовать другое соединение, или вы получите

`_mysql_exceptions.ProgrammingError: (2014, "Commands out of sync; you can't run this command now")`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...