Найти - Пользователи
Полная версия: Подвисает sys.exit().
Начало » Python для экспертов » Подвисает sys.exit().
1
ZZZ
Привет всем!

Пишу программу с использованием PyQt4 и libtorrent (всё никак не решусь описать, как я его всё-таки собрал – это целая эпопея!). При запуске вызывается функция main(), создаётся класс Main (от QObject) с кучей объектов детей и всякой нужной всячины, среди которой создаётся и libtorrent.session со всеми прилигающими и очень нужными объектами. Во понаписал-то! Графоманн хре…
Проблема такова. В main.py (главный скрипт), после создания Main запускается app.exec_() и всё замечательно работает до тех пор, пока я не давлю на капу с надписью "Выход". В этот момент запускается ещё куча всякой нужности, вроде остановки закачек с сохраниением данных для продолжения и, в конце концов, в Main вызывается qApp.exit(0).

print 1, ## Инициализация программы.
e = app.exec_()
print 2, ## Выход из главного цикла Qt.
sys.exit(e)
print 3 ## До сюда оно и не должно дойти…

Выводит '12' и виснет. ctrl+c завершает программу. Если убрать sys.exit(), то завершения програмы так же не происходит. Спустя некоторое время всё-таки выходит, но уж очень долго. И не люблю я не понимать проблем, даже если они не очень-то и мешают, потому что программа в 99.999% случаев будет запускаться c ярлычка на десктопе или из автозагрузки.
Я уверен, что проблема в libtorrent, но совершенно не представляю как её решить. Разве что вывести всю работу с ним в отдельный поток, и убивать его посредством QThread.terminate, но я чё-то не уверен в том, что оно будет работать, да и геморроя много.
Хотелось бы немного теории о том, почему оно может подвисать на sys.exit().

P.S. Стоит упомянуть, что программа имеет фактически одну нить – gui-нить. Вся коммуникация организована по средствам кьютэшных сигналов и таймеров QTimer. О том, что работает внутри libtorrent, я не имею ни малейшего представления, но если учесть, что для линковки понадобился boost_thread, то можно сделать довольно логичный вывод…

P.P.S. Проблема присутствует как в Linux, так и в Windows.

P.P.P.S. Пора избавляться от графоманства. :-)
Naota
Видимо с потоками связанно и нужно вызывать какуюто спец функцию в libtorrent для остановки всего. Я когда с твистед работал, такиая же фигня была, но уже не помню что я с ней сделал.
cybergrind

import threading
import time
import sys

def ppt():
time.sleep(5)
print ‘hello’

thr = threading.Thread(target=ppt)
print ‘start thr’
thr.start()
sys.exit()

…..
start thr
hello

т.е. суть в том, что главный поток ждет завершения всех дочерних тредов
можно сделать из либторента демона, и перед убиванием гуя послылать ему сигнал умирать, он корректно доработает, и отомрет
shiza
Есть жесткий способ выхода из приложения %)
os._exit(0)
cybergrind
ну, так имхо, в любом случае нельзя делать =)
а то потом забудешь, и когда начнуться баги….
ZZZ
Naota
Видимо с потоками связанно и нужно вызывать какуюто спец функцию в libtorrent для остановки всего.
В документации есть метод libtorrent.session.abort. В реали его не существует. В больше ничего на эту тему не нашёл.

shiza
Есть жесткий способ выхода из приложения %)
os._exit(0)
Забыл про это. Спасибо.
ИМХО так тоже делать нельзя… Но я, наверное использую питоний эвент после завершения, и через пять секунд после выхода буду убивать именно так.
Андрей Светлов
Полные сорцы - в студию. Наглядно демонстрирующие проблему. Иначе помочь сложно.
P.S.
Писал когда-то bittorrent клиента…
ZZZ
Если бы я мог её нормально вычислить… А весь код:
1. Пока закрыт.
2. Не хочу никого нагружать, разбором своих программ.

Да и обнаружилась трабла со стабильностью. Под Linux (Qt 4.3.4 и PyQt 4.3.3) всё замечательно, а под виндой (Qt 4.4.0 и PyQt 4.4.2) падает без объяснений причин. Притом, только при скачке чего-либо, но я написал тестового консольного клиента, который замечательно справился со своей задачей без единного глюка – так что трабла не в libtorrent. Единственная надпись, которая меня смущает, это:
QWaitCondition: Destroyed while threads are still waiting
которая появляется при нормальном выходе или падении. В линукс консоль чиста.
Я должен справится.

Андрей Светлов
Писал когда-то bittorrent клиента…
А чем пользовался для доступа к сети?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB