Найти - Пользователи
Полная версия: ошибки при работе потоков
Начало » Python для новичков » ошибки при работе потоков
1 2
Игнат
главный класс, назовем его 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)
что обычно провоцирует такие ошибки? гугл показал много подобных проблем, но решения не нашёл
Андрей Светлов
Ну скажите, зачем вы мешаете в кучу потоки и 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)
что это хотя бы означает? чилдрен, парент - а чьи, от кого и кому - не написано.

нетворкацес менеджер глючит сам по себе в многопоточном режиме?
мой знакомый пишет на c++/qt4 - и у него нетворкацес нормально работает в потоках
раньше тоже была такая ошибка, но он не помнит как её поборол
Андрей Светлов
Чтобы я еще больше кода видел…
Насколько понимаю, создаете QNetworkAccessManager в одном потоке, а используете в другом. А ему такое не нравится.
А почему бы не скачать страничку, а уже потом передать ее thread pool?
Андрей Светлов
И еще. Если вы используете QNetworkAccessManager в таком “линейном” виде - зачем он вам вообще нужен?
Тогда уже качать через urllib - там проблем с потоками не будет по определению.
Игнат
urllib не умеет работать с socks прокси
я разобрался - проблема была в том, что каждый поток создавал ещё один класс - и вот в том классе инициалзировалась ещё одна копия нетворкацесменеджера. когда я использовал курл в пхп - он у меня создавался отдельный, чтобы был без прокси

в общем, если в потоке создано две копии нетворменеджера - валятся эти ошибки
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