当前位置: 首页 > 面试题库 >

如何在python中选择异步或同步方法变量?

宰父衡
2023-03-14
问题内容

假设我有一个用于执行I / O操作的类:

class CommunicationStack:
    def __init__(self, socket):
        self.socket = socket

    def sync_get_data(self):
        ...

    def sync_send_data(self):
        ...

    async def async_get_data(self):
        ...

    async def async_send_data(self):
        ...

如您所见,它具有用于相同操作的sync和async变体,但是编写async_get_datasync_get_data手动操作会稍有不便。我正在寻找一种具有相同界面的聪明方法

def get_data(self):
    ...  # call sync variant or return an awaitable, depending on caller type

def send_data(self):
    ...  # call sync variant or return an awaitable, depending on caller type

因此可以方便地像这样使用:

stack = CommunicationStack(...)

def thread_procedure():
    data = stack.get_data()  # get_data returns data

async def task_procedure():
    data = await stack.get_data()  # get_data returns an awaitable

我相信可以通过检查或一些黑魔法以某种棘手的方式完成:

def is_caller_coroutine():
    return sys._getframe(2).f_code.co_flags & 0x380

检查调用程序是协程还是函数,但是弄乱python的胆量似乎是一个糟糕的设计。

问题是:选择合适变体的好方法是什么?还是有更好的方法来设计一切都像使用适配器或开发两个独立AsyncCommunicationStackSyncCommunicationStack类?


问题答案:

如果要以与常规函数相同的方式调用异步函数,则可能对使用gevent感兴趣。

asyncio希望您将函数显式标记为,async并在await发生异步情况的任何地方显式使用。换句话说,asyncio希望您具有用于同步和异步代码的不同接口。

这是为应对并发问题而做出的有意识的决定,当隐藏代码的异步特性时(例如在gevent中),很难实现。

所以是的-
如果您想同时支持两个世界,则可以采用两种不同的IndependentAsyncCommunicationStackCommunicationStackClass。虽然一旦有了异步版本,您就可以使用它强制转换关键代码,并通过asyncio.run()运行它使其同步。唯一的问题是那之后您将无法返回异步世界。



 类似资料:
  • 我意识到这是一个基本问题,但我没能在别处找到答案。 是

  • 同步调用异步方法最安全的方法是什么?

  • 问题内容: 让我使用这个小而简单的示例: 假设该函数由我无权访问的其他线程调用。 我想使用synchonize方法来确保该字符串每次仅由一个函数使用。换句话说,功能不能与同时运行。 问题答案: 那很简单: 请注意,我 既没有 使方法本身同步, 也没有 在上同步。我坚信,除非您 有意 公开该锁,否则仅对只有您的代码才能访问的对象获取锁是个好主意。这样可以轻松地向自己保证,其他任何东西都不会以与您的代

  • 我正试图从同步方法运行异步方法。但是我不能等待异步方法,因为我在同步方法中。我一定不理解TPL,因为这是我第一次使用它。 每个方法都需要前一个方法来完成,因为第一个方法的数据用于第二个方法。 Await运算符只能在异步方法中使用。考虑用'async'修饰符标记此方法,并将其返回类型更改为'task' 但是,如果我使用async修饰符,这将是一个异步操作。因此,如果我对的调用没有使用await运算符

  • 问题内容: 在Java中制作异步方法的同步版本的最佳方法是什么? 假设您有一个使用以下两种方法的类: 您将如何实现直到任务完成才返回的同步? 问题答案: 看看CountDownLatch。您可以使用以下类似方式模拟所需的同步行为: 您还可以通过2个参与者使用相同的行为,如下所示: 但是,如果您可以控制I 的源代码,建议您重新设计它以返回一个对象。这样,您可以在需要时轻松地在异步/同步行为之间进行切

  • 经常看到的一个题目,特此求解 gpt的写法是: async/await callback function

  • 问题内容: 我正在查看包含同步方法的第三方库中的一些代码,在此方法中,有一个锁定在实例变量上的同步块。与此类似: 这有意义吗?如果是这样,在同步方法中使用同步语句有什么好处? 鉴于同步方法锁定了整个对象,对我来说似乎是多余的。在使用非私有的实例变量时,这种方法是否有意义? 问题答案: 在您的示例中,该方法 同时 锁定了和的实例。其他方法可能仅锁定对象的实例 或 对象。 因此,是的,这完全取决于他们

  • 问题内容: 我想知道是否有一种简单的方法来获取“同步” readline或至少在node.js中获得同步I / O的外观 我用这样的东西,但是很尴尬 取而代之的是,我希望它像这样简单 有用的条件: (a)建议不要使用外部模块或/ dev / stdio文件句柄,我正在向代码提交网站提交代码,但这些代码在那儿不起作用 (b)可以使用异步/等待或生成器 (c)应基于行 (d)不需要在处理之前将整个标准