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()