【发布时间】:2019-07-31 17:29:02
【问题描述】:
我正在尝试在 Python 中异步运行 for 循环,就像您可以在 Javascript 中使用 map 方法和 promise.all 一样。我到处搜索如何做到这一点,但下面的代码仍然是同步运行的(一个接一个地运行,而不是让循环在完成之前的迭代时进行其他迭代,比如 promise.all 允许你)。任何帮助将不胜感激。
from jwt import scopes
from googleapiclient.discovery import build
from google.oauth2 import service_account
import json
import asyncio
key = 'file.json'
ID = 'ID'
rg = 'A1'
j2 = service_account.Credentials.from_service_account_file(key, scopes=scopes).with_subject('me@emial.com')
ar = []
cl = build('classroom', 'v1', credentials=j2)
def cour():
co = []
result1 = cl.courses().list().execute()
courses = result1.get('courses', [])
for cc in courses:
co.append(cc['id'])
return co
cco = cour()
async def main():
async def subs2(i):
await asyncio.sleep(0)
result2 = cl.courses().courseWork().list(courseId=i).execute()
works = result2.get('courseWork', [])
for work in works:
result = cl.courses().courseWork().studentSubmissions().list(courseId=work['courseId'], courseWorkId=work['id']).execute()
subs = result.get('studentSubmissions', [])
for sub in subs:
try:
ar.append(sub['assignedGrade'])
ar.append(sub['courseId'])
ar.append(sub['courseWorkId'])
ar.append(sub['userId'])
except KeyError as name:
pass
coros = [subs2(i) for i in cco]
await asyncio.gather(*coros)
if __name__ == '__main__':
cour()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
【问题讨论】:
-
您要使哪个特定调用异步运行?除了
sleep(0)之外,您的内部协程subs2(i)内部没有任何等待调用。所以它总是会同步运行。
标签: javascript python python-3.x python-asyncio google-apps