Return 结果来自 asyncio.get_event_loop
Return results from asyncio.get_event_loop
我是 asyncio 模块的新手。我有以下代码查询 return ID 的服务。如何将变量设置为 return 'findIntersectingFeatures' 函数的结果?
此外,如何在 run_in_executor 完成后执行打印语句。他们目前正在第一次迭代后立即打印。
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))
要使用asyncio,你不应该只得到事件循环,你还必须运行它。您可以使用 run_until_complete
to run a coroutine to completion. Since you need to run many coroutines in parallel, you can use asyncio.gather
将它们组合成一个并行任务:
coroutines = []
for coordinate in coordinates:
coroutines.append(loop.run_in_executor(
None, findIntersectingFeatures, coordinate))
intersections = loop.run_until_complete(asyncio.gather(*coroutines))
Also, how can I have the print statements execute after run_in_executor
has finished.
您可以 await
调用 run_in_executor
并将您的 print
放在它后面:
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)).
我是 asyncio 模块的新手。我有以下代码查询 return ID 的服务。如何将变量设置为 return 'findIntersectingFeatures' 函数的结果?
此外,如何在 run_in_executor 完成后执行打印语句。他们目前正在第一次迭代后立即打印。
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))
要使用asyncio,你不应该只得到事件循环,你还必须运行它。您可以使用 run_until_complete
to run a coroutine to completion. Since you need to run many coroutines in parallel, you can use asyncio.gather
将它们组合成一个并行任务:
coroutines = []
for coordinate in coordinates:
coroutines.append(loop.run_in_executor(
None, findIntersectingFeatures, coordinate))
intersections = loop.run_until_complete(asyncio.gather(*coroutines))
Also, how can I have the print statements execute after
run_in_executor
has finished.
您可以 await
调用 run_in_executor
并将您的 print
放在它后面:
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)).