Форум сайта python.su
главный класс, назовем его main, создает объект класса Http в себе - main.http, который качает странички через qnetworkaccessmanager
также он создает ещё один класс main.worker, который в свою очередь запускает N потоков threads (из concurrent.futures)
все потоки используют объект main.http, т.к. у main.worker-а родитель main
если один поток - то все нормально
если потоков 2 и больше - в логи валятся такие ошибки:
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QTcpSocket(0xb3f04588), parent's thread is QThread(0xb3f00800), current thread is QThread(0xb4900800)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QTcpSocket(0xb3f04588), parent's thread is QThread(0xb3f00800), current thread is QThread(0xb4900800)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QNetworkAccessManager(0xb3f00e60), parent's thread is QThread(0xb3f00800), current thread is QThread(0xb4900800)
Отредактировано (Март 2, 2011 15:28:17)
Офлайн
Ну скажите, зачем вы мешаете в кучу потоки и QNetworkAccessManager?
Офлайн
так если мне надо 10 потоков, и каждый должен парсить данные с сайта (при этом уметь авторизоваться, сохранять куки и т.п)
что же ещё делать, если не передавать в потоки ссылку на объект обёртки для qnetworkaccessmanager?
Офлайн
А зачем 10 потоков? Зачем потоки вообще, если вы используете QNetworkAccessManager? Что ваши потоки такое полезное делают?
Офлайн
каждый поток логинится на сайт и парсит оттуда информацию
сайтов много, нужна многопоточность
разве передавать один объект accessmanager в каждый поток - не вариант? как тогда поступить, чтобы не валились эти ошибки?
сама обертка для ацесменеджера примерно такая:
self.conn = QNetworkAccessManager()
request = QNetworkRequest(QUrl(url))
self.loop = QEventLoop()
self.reply= self.conn.get(request)
QtCore.QObject.connect(self.reply, QtCore.SIGNAL("finished()"), self.loop.quit);
self.loop.exec()
buf = self.reply.readAll()
Офлайн
Мультипоточность не нужна даже для множества сайтов.
QNetworkAccessManager работает в асинхронном режиме, ему достаточно главного потока. Зачем усложнять себе жизнь?
QNetworkReply - это же future object, с событием на завершение операции и прочими прелестями.
Офлайн
я вас понял, но мне она нужна
потому что каждый поток для моей задачи должен быть по сути отдельной программой. его цель не только скачать страничку.
в любом случае, я продолжаю мучаться дальше и пока не приблизился к решению этой проблемы
если поставить немного заданий - то ошибки не валятся
если чуть больше - постоянно вижу
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QNetworkAccessManager(0x8d4da60), parent's thread is QThread(0x8b78588), current thread is QThread(0x8da11b8)
Офлайн
Чтобы я еще больше кода видел…
Насколько понимаю, создаете QNetworkAccessManager в одном потоке, а используете в другом. А ему такое не нравится.
А почему бы не скачать страничку, а уже потом передать ее thread pool?
Офлайн
И еще. Если вы используете QNetworkAccessManager в таком “линейном” виде - зачем он вам вообще нужен?
Тогда уже качать через urllib - там проблем с потоками не будет по определению.
Офлайн
urllib не умеет работать с socks прокси
я разобрался - проблема была в том, что каждый поток создавал ещё один класс - и вот в том классе инициалзировалась ещё одна копия нетворкацесменеджера. когда я использовал курл в пхп - он у меня создавался отдельный, чтобы был без прокси
в общем, если в потоке создано две копии нетворменеджера - валятся эти ошибки
Офлайн