async(использует aiohttp), другой sync(использует requests); по функционалу они идентичны: при вызове соответствующего метода происходит http.get запрос на сервер, далее с полученными данными работает bs4 и под конец метод возвращает нужный результат.
У меня вопрос: как мне следует поступить: разделить модули на 2 разных или написать один(слить), но в котором будут дубликаты кода(файлы sync_base, async_base и base - в котором будет bs4)?
Про дубликаты совсем не понял, прости. Про синк честно говоря тоже (может многопоток?)
Т.к это парсер, некоторые люди, всё же, захотят воспользоваться sync версией(мб будут юзать telebot в связке) Async тут очень нужен для людей, пишущих asyncio приложения, а также для того, чтобы ускорить парсинг: При вызове метода 'get_new' выполняется и обрабатывается get запрос для получения ids манги(по умолчанию 20шт) Далее происходит 20 get запросов, чтобы получить html(страницы описания) 20 манг,- тут то и спасает async (сервер не очень шустрый, из-за чего явный буст)
Насчёт 'многопотока' что-то не очень понял: читал как-то про GIL
Ну ты даже в чате можешь gil в поиск вбить - тут это обсуждалось много раз. Если вкратце, то запрос в сеть это io-bound, не тот случай. А так лучше повникай посерьезнее, конечно. Это очень сложная тема
а что, тредпула мало?
ты там requests.Session юзаешь вообще?
Ты пишешь что Сервер не шустрый но асинк спасает... Ээээ?)
Понимаю async так: |- поток | | -- await (ждём ответа от сервера, не блокируя основной поток) | | ... | ... | - ответ пришёл, выполним то, что предначертано... | | Читал аналогию с использованием asyncio для обращения к бд
Если я отправляю одновременно 20 запросов, то на мой взгляд, тут async должно выигрывать: ... | - await (ждём ответа от сервера) | | - await (ждём ответа от сервера) | | - await (ждём ответа от сервера) | ... Нежели sync: ... | |- ждём ответа от сервера, из-за чего ждём все вместе сразу... (Блокировка потока) Ps: еду в поезде, не могу быстро ответить из-за интернета
А можешь статью скинуть, где ты это вычитал?
asyncio: await func() - блокируем текущий "поток выполнения" (таск, не путать с потоком ОС) ответ пришел, делаем дальше треды: func() - блокируем текущий поток выполнения (он же поток ОС) ответ пришел, делаем дальше asyncio с несколькими таксками t1 = asyncio.create_task(func()) - запускаем первую функцию t2 = asyncio.create_task(func2()) - запускаем вторую функцию await asyncio.gather([t1,t1]) - блокиурем текущий поток выполнения до их завершения тредпулэкзекьютор: f1 = executor.submit(func) - запускаем первую функцию f2 = executor.submit(func2) - запускаем вторую функцию r1 = f1.result() - блокиурем текущий поток выполнения до завеошения первой r2 = f2.result() - блокиурем текущий поток выполнения до завершения второй
Давно читал, может не так всё понял.
Большое спасибо
Обсуждают сегодня