gpt4 book ai didi

signature - 当您提供相同代码的异步变体时,约定是什么?

转载 作者:行者123 更新时间:2023-12-02 22:55:40 26 4
gpt4 key购买 nike

foo是子或方法。我编写了一个阻塞和一个异步变体,所以从外面看,本质区别在于返回值。我首先想到在签名中指定它,但不幸的是调度程序只查看传入端而不是两者:

> multi sub foo (--> Promise) {}; multi sub foo (--> Cool) {};
> my Promise $p = foo
Ambiguous call to 'foo(...)'; these signatures all match:
:( --> Promise)
:( --> Cool)
in block <unit> at <unknown file> line 1

我应该添加一个 Bool :$async到签名?我应该像在 JS 中一样添加名称后缀(即 foofoo-async )吗?对我来说,两者都不觉得很糟糕。目前针对此问题使用的解决方案是什么?

最佳答案

返回类型的多重分派(dispatch)无法工作,因为返回值本身可以用作多重分派(dispatch)调用的参数(并且因为几乎 Perl 6 中的每个运算符都是多重分派(dispatch)调用,这将是非常常见的情况)。

关于手头的问题:考虑到核心、模块和一堆我自己的代码中的代码,似乎给定的类或模块通常会提供同步接口(interface)或异步接口(interface),以最适合手头问题的方式为准.在两者都有意义的情况下,它们通常在类型或模块级别进行区分。例如:

  • 核心:两者都有ProcProc::Async , 和 IO::Socket::INETIO::Socket::Async .虽然有时可以通过提供 Promise 获得合理的异步 API 的情况。 - 为每个同步例程返回备选方案,在其他情况下,整体工作流程会有所不同。例如,对于同步套接字 API,坐在循环中请求数据是很合理的,而异步 API 在 Perl 6 中通过提供 Supply 更自然地表达。通过网络到达的数据包。
  • 图书馆:Cro::HTTP::Client提供一致的异步接口(interface)来执行 HTTP 请求。没有同步 API。
  • 应用程序:考虑到我的许多应用程序代码,就它们的 API 而言,事情似乎要么始终同步,要么始终异步。我发现的唯一异常(exception)是几乎完全同步的类,除了它们有几个 Supply -返回方法以提供事件通知。然而,这并不是真正被问到的情况,因为通知自然是异步的。

  • 有趣的是,我们在这里结束了,这与通过命名约定提供异步变体很常见的其他各种语言形成鲜明对比。我认为大部分原因是可以使用 await Perl 6 中的任何地方。在具有 async 的语言中,情况并非如此。/ await对,为了使用 await必须首先将调用例程重构为 async ,然后将其调用方重构为 async , 等等。

    因此,如果我们正在编写一个完全同步的代码位,并且想要使用模块中返回 Promise 的东西。 ,我们的全部成本是“只写 await”。就是这样。写信给 await-sync 的长度相同或 -async后缀,或 :sync:async命名参数。

    另一方面,人们可能会选择为某事提供同步 API,即使它在内部执行 await ,因为感觉大多数消费者只是想同步使用它。如果有人希望异步调用它,还有另一个 5 个字母的单词, start ,这将在线程池和任何 await 上触发它在代码内部执行的操作不会(假设 Perl 6.d)阻塞真正的线程,而只是安排它在 await 时继续运行。 ed 工作完成。同样,这与写 async 的长度相同 - 或更短 -后缀、命名参数等。

    这意味着我们似乎最终得到的模式(考虑到关于年轻语言的常见警告,以及需要时间发展的惯例)是:
  • 对于简单的情况:选择最常见的用例并提供它,让调用者使用 start 对其进行调整。 (同步 -> 异步) 或 await/react (async -> sync) 如果他们想要其他东西
  • 对于更复杂的情况,使用该功能的同步和异步工作流可能看起来完全不同,并且都很有值(value):分别提供它们。当然,一个可能是另一个的外观(例如,核心中的 Proc 实际上只是 Proc::Async 上的同步适配层)。

  • 我要做的最后一个观察是,模块的各个使用者几乎肯定会同步或异步使用它,而不是两者的混合。如果希望同时提供两者,那么我可能会转而使用 export tags ,所以我可以这样做:
    use Some::Thing :async;
    say await something();

    或者:
    use Some::Thing :sync;
    say something();

    并且不必在每次调用时声明我想要的。

    关于signature - 当您提供相同代码的异步变体时,约定是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53945202/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com