github3.py: Возможно ли использовать с грекетами?
Интересно, было ли это когда-нибудь раньше?
У меня есть приложение, которое загружает тонны информации из нашего экземпляра GitHub Enterprise (в настоящее время не используется github3.py, но я думаю о преобразовании его для использования github3.py). По сути, он сканирует 189 репо, а затем для каждого репо тянет ветки, теги и коммиты. Это, очевидно, довольно медленно, потому что он должен выполнять так много HTTP-запросов последовательно.
Интересно, можно ли заставить github3.py возвращать объекты grequest, чтобы у меня были запросы для параллельного выполнения запросов? Или, возможно, альтернативой будет заключаться в том, чтобы обернуть и скрыть запросы, имея возможность установить "уровень параллелизма" в github3.py и заставить его выполнять параллельные запросы. Или, может быть, контекстный менеджер:
with github3.parallel():
tags = pull_tags(git_repo)
branches = pull_branches(git_repo)
Я понимаю, что может быть довольно сложно придумать API, который хорошо работает с распараллеливанием, поскольку это такая другая парадигма. Вот почему я не хотел загромождать трекер проблем этим.
1 ответ
Это было бы чрезвычайно сложно. grequests
и другие оболочки вокруг запросов не предоставляют Session API (потому что запросы Sessions не так многопоточны, как должны быть - то есть не являются). Если они предложат способ сделать это, это может сработать. Лучший способ сделать это - создать несколько GitHub
экземпляры, по одному в каждом рабочем гринлете / потоке, и используют их в контексте каждого потока. Таким образом, у вас будет сеанс на гринлет, и ваши операции должны быть безопасными (если вы не передаете свои объекты между потоками).