Найти - Пользователи
Полная версия: Запуск парсера написанного на aiohttp в отдельном потоке
Начало » Python для экспертов » Запуск парсера написанного на aiohttp в отдельном потоке
1
marina932
Пишу графическое приложение, которое должно парсить сайт. Пока писала отдельно gui, отдельно парсер, то все было хорошо, как решила все объединить возникли проблемы.
Проблема в том, что не могу запустить парсер в отдельном потоке. Для демонстрации проблемы вот такой код накидала:
from PyQt4 import QtCore
 
import asyncio
import aiohttp
 
 
class Main(QtCore.QThread):
    def __init__(self):
        super(Main, self).__init__()
 
    def run(self):
        loop = asyncio.get_event_loop()
        with aiohttp.ClientSession(loop=loop) as session:
            content = loop.run_until_complete(
                self.fetch_page(session, 'http://python.org'))
            print(content)
 
    async def fetch_page(session, url):
        with aiohttp.Timeout(10):
            async with session.get(url) as response:
                assert response.status == 200
                return await response.read()
 
app = QtCore.QCoreApplication([])
m = Main()
m.start()
m.wait()
app.exec_()

traceback вот такой
Traceback (most recent call last):
File “/Users/marina/PycharmProjects/temp/temp2.py”, line 12, in run
loop = asyncio.get_event_loop()
File “/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/events.py”, line 626, in get_event_loop
return get_event_loop_policy().get_event_loop()
File “/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/asyncio/events.py”, line 572, in get_event_loop
% threading.current_thread().name)
RuntimeError: There is no current event loop in thread ‘Dummy-1’.

Единственное, что приходит сейчас в голову, это использовать multiprocessing, но может все таки можно в потоке все это дело запустить?
vic57
from PyQt4 import Qt
if __name__=="__main__":
    app = Qt.QApplication([])
    #w = Qt.QWidget()
    #w.show()
    m = Main()
    app.exec_()
главного цикла QApplication у вас нет
marina932
vic57
Не в этом дело, посмотри на traceback, ну и вообще в коде все это есть, просто на форум выкладываю естественно только проблемный кусок (когда убирала лишнее, забыла вставить создание event loop pyqt).
vic57
попробуй через subprocess,Thread,Popen реализовать. связь с гуем можно через Qt emit signal сделать. ИМХО от QtCore.QThread наследоваться тут не лучший вариант
loop = asyncio.get_event_loop()
with aiohttp.ClientSession(loop=loop) as session:
loop=loop не нравится, конфликт имен м.б.
from threading import Thread,Event
from time import sleep
class MyTimer(Thread):
    def __init__(self, interval=1):
        Thread.__init__(self)
        self.stopped = Event()
        self.count = 0
        self.interval = interval
    def stop(self):
        self.stopped.set()
    def run(self):
        while not self.stopped.wait(self.interval):
            self.count += 1
            print 'count:',self.count
if __name__=="__main__":
    t = MyTimer()
    t.start()
    sleep(10)
    t.stop()
простой примерчик
PooH
Тут не нужен новый поток. Все дело в том что у Qt свой цикл обработки сообщений, а у async свой, и в одном из них надо вызывать другой, чтобы дать ему обработать сообщения. Я так скрещивал PyQt и twisted. Для async попробуйте вот этот пакет Quamash
marina932
PooH
Огромное спасибо, очень сильно помогли, это то, что было нужно.
GulyaiVasko77
У вас отсутствует главный цикл.
marina932
GulyaiVasko77
Не знаю для, кого это было написано, но проблема уже давно решена благодаря PooH и главный цикл приложения ни где не терялся
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