вылетает питон-скрипт, нужна помощь

Discussion in 'PHP' started by Дикс, 17 Mar 2011.

  1. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    как узнать oтчегo вылетает питoн-скрипт, если нет никаких oшибoк?

    к слoву, чаще oн вылетает на винде
    в линуксе рабoтает дольше, нo тoже вылетает

    написан на питoн 3.2, oкнo pyqt4, мнoгoпoтoчнoсть испoльзуется futures

    запускаю пoтoки и через какoе-тo время прилoжение исчезает с экрана
    в кoнсoли никаких oшибoк, stderr перенаправлял в файл - тoже ничегo
    в винде в сoбытиях системы нет никаких нoвых записей пoсле вылета

    пoдумываю переписать мнoгoпoтoчнoсть на пoтoки pyqt, либo пoпрoбoвать вместе qnetworkaccesmanager юзать urllib

    нo как все же лoкализoвать oшибку?

    дебаггерoм тoже не представляю как этo пoймать - надo ведь скачать мнoжествo страниц в разных пoтoках

    есть здесь те, ктo мoжет пoмoчь разoбраться?
    гoтoв заплатить
     
  2. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Дикс как вы передаете данные в/из потоков?

    Создайте дополнительный поток с логгером, в остальных потоках, в ключевых местах поставьте отправку сообщений логгеру, так вы хотя бы узнаете, в какой момент рушится выполнение
     
    _________________________
  3. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    - жму кнопку - вызывается слот
    - слот создает класс и вызывает его метод, передавая ему список урлов
    - метод создает объект класс обертки для потоков, передает ему список урлов
    - обертка создает кол-во потоков, равное кол-ву урлов, исполняющим методом назначается метод предыдущего объекта, переданный по ссылке

    - во время работы каждый поток вызывает сигнал emit threadLog, который вызывает в главном классе слот log
    - этот слот пишет в ui и в консоль

    если ограничить одним потоком, будет работать долго, а потом прервется на случайном месте - может качать страничку, может её парсить и тп
    никаких ошибок
    если сделать 50 потоков - вылетит в течении 5-10 сек
    если поставить заглушку на скачивание страниц - вылетает моментально - в логе видно, что он успел поставить на загрузку первые 50 урлов и успел их просмотреть

    возможно крешится когда появляется необходимость запускать новые потоки, при завершении старых

    нужна помощь не через форум, я заплачу, т.к. это для меня сейчас важно
     
  4. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    Ошибок не выдает???!?!?! просто так он не может закрываться, должно что нибудь вылететь
     
  5. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Я хоть на питоне на программирую, но в похожей ситуации в многопоточной программе на компилируемом языке мне помогают системы логирования. Наверняка для питона что-то уже есть готовое - функциональное, потокобезопасное, с возможностью фильтрации и сортировки, и главное с удобным вьювером логов. В общем ищите, осваивайте, внедряйте.
     
  6. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    в общем, проблему вроде удалось локализовать
    в потоках одна функция вызывается рекурсивно - это и приводит к краху на винде
    на линуксе, что интересно, держится дольше


    GhostOnline

    типа профилеров кода? приведите пример пожалуйста, интересно чем же все-таки можно увидеть крах этой функции, чтобы в следующий раз не искать методом исключения

    UPD
    хотя нет, черт бы побрал эту винду - ошибка возникает и при отключении рекурсии, но пропадает если поставить 1 поток
     
    #6 Дикс, 17 Mar 2011
    Last edited: 17 Mar 2011
  7. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Профайлеры в основном для выявления медленных участков кода используются, а логгеры для отлова ошибок/багов в таких проектах которые трудно отладить.
    Например, при входе в метод - пишем что вошли и передаем значения аргументов. При выходе пишем что вышли и записываем возвращаемое значение. Тоже самое в самых ключевых и "опасных" местах. На тех логгерах которыми пользовался я можно было не только строки посылать, но почти все, даже картинки и скриншоты с экрана. Но самое главное качество у заключалось в том что несмотря на то что в лог писало сразу 20 потоков из 100 работающих, я мог выделить один поток и смотреть только то что он делал. А без этого они как бы и не нужны сильно.
    Но есть и ложка дегтя: время на внедрение и, что намного хуже засорение кода т.н. "сквозной функциональностью". У меня весь код в проекте был усеян в директивах условной компиляции(я исключал логирование из релизной конфы) и кроме этого сам код логирования занимал много места. Но зато и баги я находил исключительно быстро )
    В общем использовав это в одном проекте я решил так: без логирования - никуда, но внедрять его "вручную" тоже жесть, потому сейчас занимаюсь поиском элегантного архитектурного решения для внесения подобного функционала. Впрочем, уже в принципе нашел - АОП.
    Такие дела.

    PS а у пайтона ведь есть встроенный модуль - logging или как-то так. Но хз как он по удобству.