Уведомления

Группа в Telegram: @pythonsu

#1 Март 2, 2011 15:25:47

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

ошибки при работе потоков

главный класс, назовем его 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)

Офлайн

#2 Март 2, 2011 15:38:43

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

ошибки при работе потоков

Ну скажите, зачем вы мешаете в кучу потоки и QNetworkAccessManager?



Офлайн

#3 Март 2, 2011 16:03:47

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

ошибки при работе потоков

так если мне надо 10 потоков, и каждый должен парсить данные с сайта (при этом уметь авторизоваться, сохранять куки и т.п)
что же ещё делать, если не передавать в потоки ссылку на объект обёртки для qnetworkaccessmanager?



Офлайн

#4 Март 2, 2011 16:08:15

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

ошибки при работе потоков

А зачем 10 потоков? Зачем потоки вообще, если вы используете QNetworkAccessManager? Что ваши потоки такое полезное делают?



Офлайн

#5 Март 2, 2011 16:11:54

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

ошибки при работе потоков

каждый поток логинится на сайт и парсит оттуда информацию
сайтов много, нужна многопоточность

разве передавать один объект 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()



Офлайн

#6 Март 2, 2011 16:33:57

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

ошибки при работе потоков

Мультипоточность не нужна даже для множества сайтов.
QNetworkAccessManager работает в асинхронном режиме, ему достаточно главного потока. Зачем усложнять себе жизнь?
QNetworkReply - это же future object, с событием на завершение операции и прочими прелестями.



Офлайн

#7 Март 2, 2011 20:57:39

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

ошибки при работе потоков

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

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

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 - и у него нетворкацес нормально работает в потоках
раньше тоже была такая ошибка, но он не помнит как её поборол



Офлайн

#8 Март 2, 2011 21:18:30

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

ошибки при работе потоков

Чтобы я еще больше кода видел…
Насколько понимаю, создаете QNetworkAccessManager в одном потоке, а используете в другом. А ему такое не нравится.
А почему бы не скачать страничку, а уже потом передать ее thread pool?



Офлайн

#9 Март 2, 2011 21:20:17

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

ошибки при работе потоков

И еще. Если вы используете QNetworkAccessManager в таком “линейном” виде - зачем он вам вообще нужен?
Тогда уже качать через urllib - там проблем с потоками не будет по определению.



Офлайн

#10 Март 3, 2011 20:30:43

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

ошибки при работе потоков

urllib не умеет работать с socks прокси
я разобрался - проблема была в том, что каждый поток создавал ещё один класс - и вот в том классе инициалзировалась ещё одна копия нетворкацесменеджера. когда я использовал курл в пхп - он у меня создавался отдельный, чтобы был без прокси

в общем, если в потоке создано две копии нетворменеджера - валятся эти ошибки



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version