AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 79550260
Accepted
Pawel Pabian bbkr
Pawel Pabian bbkr
Asked: 2025-04-02 17:32:41 +0800 CST2025-04-02 17:32:41 +0800 CST 2025-04-02 17:32:41 +0800 CST

使用收集/拿取与竞赛

  • 772

我可以使用 Hyper 并行执行,并且它可以工作:

$ raku -e 'race for (^8).race(batch => 1, degree => 4) {sleep rand; .say}'
0
3
5
2
1
7
4
6

但是我怎样才能将收集/获取行为添加到这样的循环中?

在这种方法中,take 不会检测到它被包裹在 gather 上下文中:

$ raku -e '
    my @x = gather race for (^8).race(batch => 1, degree => 4) {
        sleep rand;
        take $_;
    };
    @x.say
'

Died at:
    take without gather

在这种方法中,gather 将消耗 HyperSeq 而不会真正对其进行“超级处理”:

$ raku -e '
    my @x = race gather for (^8).race(batch => 1, degree => 4) {
        sleep rand;
        take $_;
    };
    @x.say
'

[0 1 2 3 4 5 6 7]
raku
  • 3 3 个回答
  • 48 Views

3 个回答

  • Voted
  1. librasteve
    2025-04-02T18:17:03+08:002025-04-02T18:17:03+08:00

    您所要求的是一种并行数据结构(在本例中是收集/获取结果的容器),用于保护来自多个线程的写入操作。虽然 raku 语法不会阻止这样的实现,但它并不旨在使标准数据结构原子化,因为这会增加大量开销和死锁的可能性。在这种要求下,raku 具有出色的并发语法,可帮助您跨多个进程映射/减少计算。

    • 3
  2. ugexe
    2025-04-03T08:21:03+08:002025-04-03T08:21:03+08:00

    请参阅gather take 文档底部的注释,其中提到了与 react/whenever 类似的问题,即新线程上没有控制异常的处理程序。例如:

    $ raku -e 'say gather { await start { take 42 } };'
    An operation first awaited:
      in block <unit> at -e line 1
    
    Died with the exception:
        take without gather
          in block  at -e line 1
    
    • 2
  3. Best Answer
    raiph
    2025-04-03T09:40:53+08:002025-04-03T09:40:53+08:00

    我可以使用并行执行race并且它可以工作

    但仅限于星期二。我猜你已经知道我回答的第一部分,但编译器可以决定是否并行化。略微但公平地引用相关设计文档并强调:

    hyper/race 请求(但不要求)并行评估。

    ----

    但是我怎样才能向这样的循环中添加gather/行为呢?take

    再次引用设计文档:

    您可以将其视为race带有gather“ try take start {...}”的并行计算。

    也就是说,使用race意味着您已经自动免费获得gather/take行为,而无需实际使用gather/ take。

    ----

    gather race ...出现错误信息并挂掉take without gather

    race gather ...“有效”但不能并行

    我不确定该如何看待这两种情况。

    ----

    在回答Raku 提供了哪些并发机制? 时,Jonathan Worthington 提到了以下gather内容take:

    • gather/机制take用于延迟生成值。这在各种语言中都被视为生成器函数;然而,在 Raku 中,没有单个堆栈框架限制,因此它们具有协程功能。(这在任何涉及异步编程的上下文中都不是,但它仍然符合并发的定义)。

    我不太确定括号里的内容。我无法解析“这不属于任何涉及的上下文”,而且句子的后半部分似乎含糊不清。

    ----

    让我印象深刻的一件事是gather/take默认为lazy。使用 ofrace应该覆盖它,并使其变为eager,但我心里想,Rakudo 可能有一个错误导致它处于 lazy 状态,并且想知道是否是 lazy 行为导致了代码中看到的行为race gather ...。然而,我尝试在我认为可能需要的地方插入显式eager,但我所做的一切都没有起到作用。

    • 1

相关问题

  • 初始化数组时数组意外变平

  • 如何使用 Raku Grammars 的梳理功能?

  • $¢ 变量在 Raku 中起什么作用?

  • 是否可以预定义 Str 的初始大小?

  • 避免在一系列条件中重复相同的变量

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve