首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从asyncio.get_event_loop返回结果

从asyncio.get_event_loop返回结果
EN

Stack Overflow用户
提问于 2018-05-07 18:50:22
回答 1查看 1.2K关注 0票数 0

我刚开始使用异步模块。我有以下代码,用于查询服务以返回ID。如何设置一个变量来返回'findIntersectingFeatures‘函数的结果?

此外,如何让打印语句在run_in_executor完成后执行。它们目前正在第一次迭代之后立即打印。

代码语言:javascript
复制
import json, requests, time
import asyncio

startTime = time.clock()

out_json = "UML10kmbuffer.json"

intersections = []

def findIntersectingFeatures(coordinate):

    coordinates = '{"rings":' + str(coordinate) + '}'
    forestCoverURL = 'http://server1.ags.com/server/rest/services/Forest_Cover/MapServer/0/query'
    params = {'f': 'json', 'where': "1=1", 'outFields': '*', 'geometry': coordinates, 'geometryType': 'esriGeometryPolygon', 'returnIdsOnly': 'true'}
    r = requests.post(forestCoverURL, data = params, verify=False)
    response = json.loads(r.content)

    if response['objectIds'] != None:
        intersections.append(response['objectIds'])

    return intersections


with open(out_json, "r") as f_in:
    for line in f_in:
        json_res = json.loads(line)

coordinates = []

# Get features
feat_json = json_res["features"]
for item in feat_json:
    coordinates.append(item["geometry"]["rings"])

loop = asyncio.get_event_loop()

for coordinate in coordinates:
    loop.run_in_executor(None, findIntersectingFeatures, coordinate)


print("Intersecting Features:  " + str(intersections))

endTime = time.clock()
elapsedTime =(endTime - startTime) / 60
print("Elapsed Time: " + str(elapsedTime))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-07 20:09:49

要使用异步,您不应该只获得事件循环,还必须运行它。您可以使用run_until_complete运行协同完成。由于需要并行运行多个协同任务,所以可以使用asyncio.gather将它们组合成一个并行任务:

代码语言:javascript
复制
coroutines = []
for coordinate in coordinates:
    coroutines.append(loop.run_in_executor(
        None, findIntersectingFeatures, coordinate))

intersections = loop.run_until_complete(asyncio.gather(*coroutines))

此外,如何让打印语句在run_in_executor完成后执行。

您可以awaitrun_in_executor的调用,并将您的print放在后面:

代码语言:javascript
复制
def find_features(coordinate):
    inter = await loop.run_in_executor(None, findInterestingFeatures, coordinate)
    print('found', inter)
    return inter

# in the for loop, replace coroutines.append(loop.run_in_executor(...))
# with coroutines.append(find_features(coordinate)).
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50220663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档