Python 仅在访问时执行future
我想做如下工作:Python 仅在访问时执行future,python,python-3.x,python-asyncio,python-3.6,Python,Python 3.x,Python Asyncio,Python 3.6,我想做如下工作: import asyncio async def g(): print('called g') return 'somevalue' async def f(): x = g() loop = asyncio.get_event_loop() loop.run_until_complete(f()) loop.close() 没有输出的地方。请注意,我没有等待g()。这将生成一个g未等待异常,但我正在寻找g肯定没有运行的行为 这对我来说很有用,因
import asyncio
async def g():
print('called g')
return 'somevalue'
async def f():
x = g()
loop = asyncio.get_event_loop()
loop.run_until_complete(f())
loop.close()
没有输出的地方。请注意,我没有等待g()
。这将生成一个g未等待
异常,但我正在寻找g
肯定没有运行的行为
这对我来说很有用,因为我有一个长时间运行的操作和复杂的设置,但我只在某些情况下需要它的结果,所以为什么要在不需要的时候运行它呢。一种“随需应变”的情况
如何才能做到这一点?一个选项是使用简单的标志来表示任务:
import asyncio
import random
async def g(info):
print('> called g')
if not info['skip']:
print('* running g', info['id'])
await asyncio.sleep(random.uniform(1, 3))
else:
print('- skiping g', info['id'])
print('< done g', info['id'])
return info['id']
async def main():
data = [{
'id': i,
'skip': False
} for i in range(10)]
# schedule 10 tasks to run later
tasks = [asyncio.ensure_future(g(info)) for info in data]
# tell some tasks to skip processing
data[2]['skip'] = True
data[5]['skip'] = True
data[6]['skip'] = True
# wait for all results
results = await asyncio.gather(*tasks)
print(results)
print("Done!")
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
也许投票结束这项工作的人可以让我知道这个问题有什么不清楚的地方。我想要一个在被访问之前不会开始执行的未来,如果我使用了错误的术语,那就是缺乏知识,而不是懒惰;)那么:
如果条件:result=await x
?您好,它在windows上工作。不确定为什么要等待f
,而不是等待g
。如果我是你,我只会在这种情况下返回“未来”,并在需要时取消它。我不想半完成一个操作(启动并取消它)。我想传递一个未来,然后只在需要的时候运行它。有时候根本不需要它,在这种情况下,我甚至不想让它启动。
import asyncio
async def coro(x):
print('coro', x)
return x
async def main():
task1 = asyncio.ensure_future(coro(1))
task2 = asyncio.ensure_future(coro(2))
task3 = asyncio.ensure_future(coro(3))
task2.cancel()
for task in asyncio.as_completed([task1, task2, task3]):
try:
result = await task
print("success", result)
except asyncio.CancelledError as e:
print("cancelled", e)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()