首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python (asyncio)中创建一个可以在创建后启动的懒惰未来?

如何在Python (asyncio)中创建一个可以在创建后启动的懒惰未来?
EN

Stack Overflow用户
提问于 2018-06-08 06:24:48
回答 1查看 556关注 0票数 3

我正在试着用Python语言理解asyncio。我写了这个小程序,当调用它时,它将首先打印

服务器引导

做一些叫做

然后在一秒钟之后

异步事物

这正是它应该做的,但这还不是我想要的方式。

基本上,这模拟了一个Server,它想要在依赖于ThingThatWeAreWaitingOn__init__中创建一个PeerPool。我希望能够在__init__中创建PeerPool,并在准备就绪时传递PeerPool可以使用的Awaitable[ThingThatWeAreWaitingOn]。同样,这似乎工作得很好,但问题是,根据现在的代码,我们直接从__init__内部开始解析ThingThatWeAreWaitingOn的任务,但理想情况下,我希望能够从run()内部开始。

我该怎么做呢?

import asyncio
from typing import (
    Awaitable,
    Any
)

class ThingThatWeAreWaitingOn():
    name = "Async Thingy"

class PeerPool():

    def __init__(self, discovery: Awaitable[ThingThatWeAreWaitingOn]):
        self.awaitable_discovery = discovery

    def do_stuff(self):
        print("Do stuff called")
        self.awaitable_discovery.add_done_callback(lambda d: print(d.result().name))

class Server():

    def __init__(self):
        # This immediately kicks of the async task but all I want is to 
        # create a Future to pass that would ideally be kicked off in
        # the run() method
        self.fut_discovery = asyncio.ensure_future(self.get_discovery())
        self.peer_pool = PeerPool(self.fut_discovery)
    
    async def get_discovery(self):
        await asyncio.sleep(1)
        return ThingThatWeAreWaitingOn()

    def run(self):
        loop = asyncio.get_event_loop()
        print("Server booting")

        # Here is where I want to "kick off" the self.fut_discovery but how?
        # self.fut_discovery.kick_off_now()

        self.peer_pool.do_stuff()

        loop.run_forever()

server = Server()
server.run()

下面是一个可运行的演示的链接:https://repl.it/repls/PleasedHeavenlyLock

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50750938

复制
相关文章

相似问题

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