Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 12, 2017 23:44:21

kazaff
От:
Зарегистрирован: 2011-08-12
Сообщения: 26
Репутация: +  2  -
Профиль   Отправить e-mail  

asyncio | Запуск производителя и потребителя

Есть код, который парсит страницы из списка и напарсенное сохраняет в базу sqlite3.

 async def main():
    authors = json.load(open(r'test/authors_list.txt'))[:100] # для теста
    async with aiohttp.ClientSession() as session:
        for x in authors:
            url = urljoin(config.SAMLIB_DOMAIN, x[0]); print(url)
            html = await crawler.fetch(session, url)
            if parser.SI_parse_index_counters(html):
                _upddate, _counters = parser.SI_parse_index_counters(html)
                _upddate = hooks.convert_date(_upddate)
            else:
                _upddate, _counters = '', [0, 0]
                # author_link, author_name, author_text, author_descr, last_update, works_count, works_size, last_check
            db.update_authors_counters([
                x[0],
                x[1],
                x[2],
                x[3],
                _upddate,
                _counters[1],
                _counters[0],
                datetime.datetime.now()
            ])

update_authors_counters:
 def update_authors_counters(args):
    '''author_link, author_name, author_text, author_descr, last_update, works_count, last_check'''
    print(*args)
    query = '''
    INSERT INTO samlib_testdb (
    author_link, author_name, author_text, author_descr, last_update, works_count, works_size, last_check
    )
    VALUES
    (
       ?, ?, ?, ?, ?, ?, ?, ?
    );
    '''
    dbcurr.execute(query, args)
    dbconn.commit()
Затем main запускается в loop.run_until_complete(main()). Прямо, как кирпич.
Все работает, но база мееедленная. Хочу переделать этот код в две корутины:
1) Производитель, который парсит данные из списка интернет страниц.
2) Потребитель, который распарсенное сохраняет в базу данных.

Я не понимаю, как запустить эти корутины одновременно. Если с помощью async.gather(coro1(), coro2()), то у потребителя могут закончится данные или он будет ждать вечно.
Этот вопрос выглядит так, будто он решается одной-двумя строчками, но я зашел в тупик.

P.S. Про sqlite3 - буду переписывать на postgre



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version