是否可以从另一个 Promise 终止一个 Promise 的代码块?

2024-02-17

我写了这个测试程序:

await Promise.anyof(
  Promise.allof((^5).map: {start { sleep 10; say "done $_" } }),
  Promise.in(5).then: { say 'ouch' }
);
sleep 10;

当第二个 Promise 超时时,它会打印“ouch”并且等待退出,但第一个 Promise 的代码块仍在运行。再过五秒,它的五个进程结束并打印“完成”:

$ ./test1.p6
ouch
done 0
done 1
done 2
done 3
done 4

我试图终止第一个承诺,将其分配给一个变量,然后调用.break第二个承诺中的方法,但它不起作用。

有没有办法杀死第一个承诺和它开始的其他五个子承诺?


您必须以某种方式告诉该过程它不必完成。

my $cancel = Cancellation.new;

await Promise.anyof(
  Promise.allof(
    (^5).map: {
      last if $cancel.cancelled;

      start {
        sleep 10;
        say "done $_" unless $cancel.cancelled
      }
    }
  ),
  Promise.in(5).then: {
    $cancel.cancel;
    say 'ouch'
  }
);

如果你想要类似的东西Promise.in()可以取消,让我们开始查看现有代码 https://github.com/rakudo/rakudo/blob/74687ae5cf13bad24eac515500dc670b143d602a/src/core/Promise.pm6#L252-L257.

method in(Promise:U: $seconds, :$scheduler = $*SCHEDULER) {
    my $p   := self.new(:$scheduler);
    my $vow := $p.vow;
    $scheduler.cue({ $vow.keep(True) }, :in($seconds));
    $p
}

请注意,结果为$scheduler.cue是取消。

为了简单起见,我只是将 Promise 和 Cancellation 包装在一个类中。
(我不想重新实现每个方法)。

class Cancellable-Timer {
    has Promise      $.Promise;
    has              $!vow;
    has Cancellation $!cancel;

    method !SET-SELF ( $!promise, $!vow, $!cancel ){
        self
    }

    method in (::?CLASS:U: $seconds, :$scheduler = $*SCHEDULER) {
        my $p   := Promise.new(:$scheduler);
        my $vow := $p.vow;
        my $cancel = $scheduler.cue({ $vow.keep(True) }, :in($seconds));
        self.bless!SET-SELF($p,$vow,$cancel);
    }

    method cancel ( --> Nil ) {
        # potential concurrency problem
        if $!Promise.status == Planned {
            $!cancel.cancel;          # cancel the timer
            $!vow.break("cancelled"); # break the Promise
        }
    }

    method cancelled () {
        # Ignore any concurrency problems by using the Promise
        # as the sole source of truth.
        $!Promise.status ~~ PromiseStatus::Broken
    }
}

my $timer = Cancellable-Timer.in(1);
my $say = $timer.Promise.then: *.say;
Promise.in(0.1).then: {$timer.cancel};
await $say;

请注意,上面的课程只是一个粗略的初稿。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以从另一个 Promise 终止一个 Promise 的代码块? 的相关文章

  • AngularJS 服务并承诺最佳实践

    我有一个 AngularJS 应用程序services 调用 http资源并返回promise我在控制器中解决了这个问题 这是我正在做的事情的示例 app service Blog function http q var deferred
  • Mongoose 对 Promise 拒绝处理

    我有点与 NodeJS 中的 Promise 模式作斗争 我正在数据库中查找用户 然后使用用户引用保存新实体 但是当用户不在数据库中时 我应该返回拒绝 但我不确定如何正确执行 有没有办法做得更好 顺便说一句 对不起 咖啡脚本 User fi
  • Java 执行器和长寿命线程

    我继承了一些使用 Executors newFixedThreadPool 4 的代码运行 4 个长寿命线程来完成应用程序的所有工作 这是推荐的吗 我读过Java 并发实践 https rads stackoverflow com amzn
  • AWS Lambda 提前结束(没有任何显式返回或回调)

    我在放入 AWS Lambda 中的一些 Node js 代码时遇到了一些问题 我需要进行几个异步调用 虽然第一个调用的行为符合我的预期 但 lambda 函数在第二个调用完成之前终止 返回值为 null 这让我认为 lambda 正在执行
  • Promise 构造函数回调的主体何时执行?

    假设我有以下代码构造一个Promise function doSomethingAsynchronous return new Promise resolve gt const result doSomeWork setTimeout gt
  • 同步获取已解决 Promise 的值

    如果我们知道一个Promise肯定已经解决了 我们如何访问该值 如果不能 为什么不呢 let a Promise resolve 123 console log a value 以下不起作用 它打印 First Last 123 conso
  • 在 Java EE 中手动启动新线程安全吗?

    对于在会话范围内的 JSF 托管 bean 中生成线程是否安全 我找不到明确的答案 线程需要调用无状态 EJB 实例 依赖注入到托管 bean 上的方法 背景是我们有一份需要很长时间才能生成的报告 由于我们无法更改服务器设置 这导致 HTT
  • 对象锁定私有类成员 - 最佳实践? (爪哇)

    I asked 类似的问题 https stackoverflow com questions 10548066 multiple object locks in java前几天 但对回复不满意 主要是因为我提供的代码存在一些人们关注的问题
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • Twisted 的 Deferred 和 JavaScript 中的 Promise 一样吗?

    我开始在一个需要异步编程的项目中使用 Twisted 并且文档非常好 所以我的问题是 Twisted 中的 Deferred 与 Javascript 中的 Promise 相同吗 如果不是 有什么区别 你的问题的答案是Yes and No
  • 为 Promise 编写循环的正确方法。

    如何正确构造循环以确保满足以下条件承诺电话和被束缚的记录器 log res 通过迭代同步运行 蓝鸟 db getUser email then function res logger log res this is a promise 我尝
  • D 并发写入缓冲区

    假设您有一个大小为 N 的缓冲区 必须将其设置为确定的值 例如零或其他值 缓冲区中的此值设置分为 M 个线程 每个线程处理缓冲区的 N M 个元素 缓冲区不能immutable 因为我们改变了值 消息传递也不起作用 因为禁止传递 ref 或
  • ExpressJS 后端将请求放入队列

    我有客户端发送要由服务器执行的任务 但这些请求应该以类似队列的方式处理 知道我该怎么做吗 谢谢 express Router post tasks function req res This is the task to perform W
  • duckmap 到底有什么作用?

    From 文档 https docs perl6 org routine duckmap duckmap将会应用 block每个元素上并返回一个新列表 其中包含块的已定义返回值 对于未定义的返回值 duckmap如果该元素实现了 将尝试下降
  • 与 GNU Make 等 Python 相关的并行任务并发

    我正在寻找一种方法或者可能是一种哲学方法来如何在 python 中执行类似 GNU Make 的操作 目前 我们使用 makefile 来执行处理 因为 makefile 非常擅长通过更改单个选项 j x 进行并行运行 此外 gnu mak
  • 什么是“非阻塞”并发?它与普通并发有何不同?

    什么是 非阻塞 并发 它与使用线程的普通并发有何不同 为什么不在所有需要并发的场景中都使用非阻塞并发呢 使用非阻塞并发有开销吗 我听说Java中可以实现非阻塞并发 我们是否应该在特定场景下使用此功能 将这些方法之一与集合一起使用是否有区别或
  • Python 多处理:全局对象未正确复制到子级

    前几天我回答了一个关于SO的问题 https stackoverflow com q 67047533 1925388关于并行读取 tar 文件 这是问题的要点 import bz2 import tarfile from multipro
  • mongodb/node.js 中单文档并发读写操作的问题

    编辑 6 15我尝试运行相同的代码 在调用之前添加延迟 doSafePush 再次收到 ConcurrencyDBError 时 即执行return when resolve wait delay 35 then function doSa
  • 确定自上次访问 SQL Server 以来的行更改

    我们有一个多用户系统 用户将数据保存到中央 SQL Server 2005 数据库中 我们遇到了一个问题 即一个用户刷新数据库中的更改 而另一个用户保存新数据 我们当前收集更改的方式是每个表上都有一个时间戳列 该列在每行插入 更新时都会填充
  • scala.concurrent.blocking - 它实际上做了什么?

    我花了一段时间学习 Scala 执行上下文 底层线程模型和并发性的主题 你能解释一下通过什么方式吗scala concurrent blocking 调整运行时行为 and 可以提高性能或避免死锁 如中所述scaladoc http www

随机推荐

  • 对日期和时间值进行排序

    简而言之 我有一个不同日期和时间的字符串数组 每个元素的格式如下 2015 08 27T22 24 31 903 即 YYYY MM DDT时 分 SS MMM 我正在对它们进行排序 是否有默认方法可用于对此格式进行排序 我现在正在做的是将
  • 是否有相当于 Backbone.js 路由器的 Ember.js 用于历史记录和哈希更改?

    在 Backbone js 中 您可以使用路由器绑定到 个更改以在单页 HTML5 应用程序中导航 Ember js 是否有等效项 或者我是否错过了其设计的一些基本内容 有计划为 Ember 编写一个路由器 它可能会与 Ember Stat
  • 如何隔离 Jenkins 管道 Groovy 共享库类加载器?

    我有一个 Groovy 库作为全局共享库提供 package com example Grab group org apache httpcomponents module httpclient version 4 5 3 import o
  • foreach 列表项的逆序

    我想颠倒此代码列表项的顺序 基本上 这是从最旧到最近的一组年份 我正在尝试扭转该输出 倒着走 如果您正在寻找纯粹的 PHP 解决方案 您也可以简单地从列表中向后计数 从前到后访问它
  • 如何使用DLL中的类?

    我可以将类放入 DLL 中吗 我写的类是这样的 class SDLConsole public SDLConsole SDLConsole void getInfo int int void initConsole char char SD
  • 如何在项目中使用Font Awesome图标作为ImageButton的图标

    我在实现如何在 Xamarin 应用程序中使用 Font Awesome 图标时遇到问题 我想将其与ImageButton作为图标 我发现的大多数教程都无法帮助我理解它是如何工作的 正如中所解释的微软文档 https learn micro
  • Pytest不收集静态方法

    我有一个测试类 其中包含一些静态方法和普通方法 问题是pytest不收集静态方法 我在文档中找不到与此相关的任何内容 我怎样才能让它也收集静态方法 class TestFoo object staticmethod def test bar
  • 如何在 Honeycomb ActionBar 中创建自定义下拉菜单?

    我想在我的项目中的操作栏中添加一个自定义下拉菜单 类似于谷歌图书应用程序 屏幕 中可以找到的菜单 在本例中 它代表了本书的完整目录 我尝试按照开发人员网站上的指南进行操作 其中有一个SpinnerAdapter 的示例 http devel
  • 如何使用自定义列表适配器显示 listView 为空

    我有一个列表适配器类 它填充我的列表视图 但如果我的列表由于某种原因为空 它就只是空白 我怎样才能让它添加一个项目到列表中并显示 列表为空 我可能想添加另一个项目 为空项目制作不同的布局文件 但我不确定如何使用两种类型的视图 这是我的列表适
  • 修复 TS2688:在 node_modules 中找不到类型定义文件

    运行 tsc 时 我得到了很多TS2688 Cannot find type definition file for someLibrary 这些库来自node modules 我曾尝试排除node modules and skipLibC
  • 如何在 Debian Lenny 上使用 ssl、readline 和 zlib 编译 Python 2.4.6

    我有一个装有 Debian 7 1 的虚拟 Linux 盒子 我需要 Python 2 4 6 来恢复旧的 Zope 安装 当然是为了将其更新到 Plone 4 我绝对需要ssl支持 当我编译时 我想要readline当然 也是如此 最后
  • 在 KOPS 托管集群中轮换 kubernetes 证书

    我已经通过以下方式启动了几个集群KOPS https github com kubernetes kops而且 作为 k8s 集群配置新手 我与我的团队共享了整个 kube 配置文件 我错误地认为我可以轻松更改用户名和密码 以防止已离开公司
  • 如何在 MVC 网格的 Kendo UI 中将焦点设置到单元格

    我需要将 Kendo UI 网格上的焦点设置到 DataBound 事件期间第一行中的特定单元格 我使用 Kendo 进行 MVC 这是我的专栏的定义 columns Bound o gt o QtyCurrentlyReceived Wi
  • 在Zend studio中,如何告诉ide变量的类型,以便我有自动完成功能?

    在php中我们使用include 因此 变量在一个文件中定义 然后它们的范围也跨越包含的文件 Zend studio 不知道如何获取我在包含文件中使用的变量的类型 当变量类型是一个大类时 这非常烦人 有没有办法提示 ide 有关变量类型的信
  • 为什么我的 foreach 中的代码无法访问? (经过单元测试的工作代码的精确副本)

    下面的代码是完美运行的代码的精确副本 不同之处在于 此代码放置在 WCF 服务应用程序项目中 而工作代码来自 Windows 窗体应用程序项目 foreach 中的代码无法访问 这很奇怪 因为我之前测试过该代码并且它有效 返回了正确的值 p
  • 如何使这个通用 TypeScript 函数按预期工作?

    我正在尝试定义一个与 TypeScript 中的类型系统配合良好的函数 这样我就可以获取对象的键 并且如果该键的值需要进行一些修改 转换自定义string键入一个boolean在我的示例中 我可以在不转换类型的情况下做到这一点 它具有相同的
  • c# 从messagebox.show popup中选择文本

    我已经在 google 和 stackoverflow 上搜索了 2 个小时 一定有一些东西我只是忽略了 有没有一种简单的方法可以使消息框中的文本可供选择 截至目前 当我调用 MessageBox Show 时 我无法复制显示的文本 为什么
  • Common Lisp 整数到十六进制的转换

    是否有一个与 parse integer ff radix 16 类似的函数可以让我以另一种方式返回 如果我有 int 255 如何将其转换为字符串 ff write to string 255 base 16
  • 使用自定义函数后如何存储新的数据框?

    我刚刚开始使用用户定义函数 所以这可能不是一个非常复杂的问题 请原谅我 我有一些数据帧 它们都有一个名为 interval time 的列 例如 我想将此列重命名为 Timestamp 我知道我可以用这个手动完成此操作 df df rena
  • 是否可以从另一个 Promise 终止一个 Promise 的代码块?

    我写了这个测试程序 await Promise anyof Promise allof 5 map start sleep 10 say done Promise in 5 then say ouch sleep 10 当第二个 Promi