내가 지금 Github에서의 API와 함께 일하고 있어요, 여기에 모든 목록의 각 REPO에 대한 요청을 당겨 가져 오는 기능입니다 :이 루프를 비동기로 만드는 방법은 무엇입니까?
async def get_all_pulls(repos, api):
pulls = []
for repo in repos:
try:
async for pull in api.getiter(f'/repos/{org}/{repo}/pulls?state=all'):
pull['repo'] = repo
if pull not in pulls:
pulls.append(pull)
except Exception:
print(f"Bad repo/no access=> [{repo}]")
continue
return pulls
다 잘하지만 하나의 작은 문제 일, 그것은 시간이 많이 걸립니다의 때문에 repos를 반복합니다 (30 개가 있다고 가정 해 봅시다).
내가이 (이 사용할 때이 선언에서 루프를 치우는하고 확실한 것) 같은 비동기 만들려고 노력했다 :
이 # gather all prs for all repos
tasks = [asyncio.ensure_future(get_all_pulls_for_repo(api, repo)) for repo in repos]
results = await asyncio.gather(*tasks)
# unwrap list of lists
for res in results:
all_pull_requests += res
는하지만 충돌을 얻을 말의 repos 등 내가 나쁜를 내가 여기서 중요한 무엇인가 놓치고 있다고 생각하지만 무엇을 얻을 수는 없다.
왜 비동기 for 루프에서 충돌이 발생합니까? 그리고 그것을 작동시킬 수 있습니까?
갱신 1 : get_all_reviews에서 역 추적 : 여기
Traceback (most recent call last):
File "/home/metal/Documents/projects/-git/async_git_tool.py", line 193, in <module>
loop.run_until_complete(main())
File "/home/metal/.pyenv/versions/3.6.0/lib/python3.6/asyncio/base_events.py", line 466, in run_until_complete
return future.result()
File "/home/metal/Documents/projects/-git/async_git_tool.py", line 113, in main
reviewed = await get_all_reviews(created, api, ss_programmers)
File "/home/metal/Documents/projects/-git/async_git_tool.py", line 181, in get_all_reviews
async for review in api.getiter(f'/repos/{org}/{pr_repo}/pulls/{pr_number}/reviews'):
File "/home/metal/Documents/projects/-git/venv/lib/python3.6/site-packages/gidgethub/abc.py", line 85, in getiter
data, more = await self._make_request("GET", url, url_vars, b"", accept)
File "/home/metal/Documents/projects/-git/venv/lib/python3.6/site-packages/gidgethub/abc.py", line 66, in _make_request
data, self.rate_limit, more = sansio.decipher_response(*response)
File "/home/metal/Documents/projects/-git/venv/lib/python3.6/site-packages/gidgethub/sansio.py", line 284, in decipher_response
rate_limit = RateLimit.from_http(headers)
File "/home/metal/Documents/projects/-git/venv/lib/python3.6/site-packages/gidgethub/sansio.py", line 226, in from_http
limit = int(headers["x-ratelimit-limit"])
File "multidict/_multidict.pyx", line 140, in multidict._multidict._Base.__getitem__
File "multidict/_multidict.pyx", line 135, in multidict._multidict._Base._getone
KeyError: "Key not found: 'x-ratelimit-limit'"
는 funciton 자체입니다 :
async def get_all_reviews(pulls, api, programmers):
reviewed_pulls = []
for pull in pulls:
pr_repo = pull['repo']
pr_number = str(pull['number'])
async for review in api.getiter(f'/repos/{org}/{pr_repo}/pulls/{pr_number}/reviews'):
if review['user']['login'] not in programmers \
and pull not in reviewed_pulls:
reviewed_pulls.append(pull)
return reviewed_pulls
나는 그런 식으로 전화 해요 :
reviewed = await get_all_reviews(softserve_created, api, ss_programmers)
Github API를 사용하기 위해 사용하는 구체적인 모듈은 무엇입니까? –
@MikhailGerasimov _Gidgegethub_ (http://gidgethub.readthedocs.io/en/stable/) – Roman