如何将原子计数器添加到 powershell ForEach -Parallel 循环

2023-11-27

在这个问题中,解释了如何添加到并发ThreadSafe集合Powershell:如何将结果添加到数组(ForEach-Object -Parallel)

我有一个更简单的用例,我只想增加一个值。 (整数)。

是否可以在 Powershell 中使用某种原子整数数据类型来完成?

$myAtomicCounter = 0

$myItems | ForEach-Object -Parallel {
    #...other work

    $myAtomicCounter.ThreadSafeAdd(2)

    # .. some more work using counter
}

Write-Host($myAtomicCounter)

在 PowerShell 中,当从多个线程更新单个值时,您必须使用锁定机制,例如Mutex, SemaphoreSlim甚至Monitor.Enter否则更新操作不会是线程安全的. 同步哈希表不能确保更新键值是线程安全的.

下面是一个简单的演示,证明了上述内容:

$sync = [hashtable]::Synchronized(@{ })
$attempts = 0

do {
    $sync['Value'] = 0
    $attempts++
    0..10 | ForEach-Object -Parallel {
        $sync = $using:sync
        Start-Sleep -Milliseconds 200
        $sync['Value']++
    } -ThrottleLimit 11
}
while ($sync['Value'] -eq 11)

"It took $attempts attempts to fail..."

假设我们有一个数组的数组:

$toProcess = 0..10 | ForEach-Object {
    , (Get-Random -Count (Get-Random -Minimum 5 -Maximum 10))
}

您想要跟踪每个数组中已处理的项目,以下是您可以使用的方法Mutex:

$processedItems = [hashtable]::Synchronized(@{
    Lock    = [System.Threading.Mutex]::new()
    Counter = 0
})

$toProcess | ForEach-Object -Parallel {
    # using sleep as to emulate doing something here
    Start-Sleep (Get-Random -Maximum 5)

    # bring the local variable to this scope
    $ref = $using:processedItems
    # lock this thread until I can write
    if($ref['Lock'].WaitOne()) {
        # when I can write, update the value
        $ref['Counter'] += $_.Count
        # and realease this lock so others threads can write
        $ref['Lock'].ReleaseMutex()
    }
}

$processedCount = ($toProcess | Write-Output | Measure-Object).Count

# Should be True:
$processedItems['Counter'] -eq $processedCount

另一个使用安全递增计数器的示例Monitor.Enter以及一个尝试类似于 C# 的自定义函数lock陈述:

function lock {
    param(
        [Parameter(Mandatory)]
        [object] $Object,

        [Parameter(Mandatory)]
        [scriptblock] $ScriptBlock
    )

    try {
        [System.Threading.Monitor]::Enter($Object)
        & $ScriptBlock
    }
    finally {
        [System.Threading.Monitor]::Exit($Object)
    }
}

$utils = [hashtable]::Synchronized(@{
    LockFunc = $function:lock.ToString()
    Counter  = @(0)
})

$toProcess | ForEach-Object -Parallel {
    # bring the utils var to this scope
    $utils = $using:utils
    # define the `lock` function here
    $function:lock = $utils['LockFunc']

    Start-Sleep (Get-Random -Maximum 5)

    # lock the counter array
    lock($utils['Counter'].SyncRoot) {
        # increment and release when done
        $utils['Counter'][0] += $_.Count
    }
}

$processedCount = ($toProcess | Write-Output | Measure-Object).Count

# Should be True:
$utils['Counter'][0] -eq $processedCount

PowerShell 中一种更简单的方法是将并行循环输出到线性循环,您可以在其中安全地更新计数器,而不必关心线程安全:

$counter = 0

$toProcess | ForEach-Object -Parallel {
    # using sleep as to emulate doing something here
    Start-Sleep (Get-Random -Maximum 5)

    # when this thread is done,
    # output this array of processed items
    $_
    
} | ForEach-Object {
    # then the output from the parallel loop is received in this linear
    # thread safe loop where we can update the counter
    $counter += $_.Count
}

$processedCount = ($toProcess | Write-Output | Measure-Object).Count

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

如何将原子计数器添加到 powershell ForEach -Parallel 循环 的相关文章

  • 无需停止程序即可输入

    我正在尝试制作一个倒计时器来打印剩余时间 当您输入某些内容时 它会打印您输入的内容 我的问题是我不想等待输入 只是继续运行计时器 我的错误代码 timer 100 while True print timer timer 1 if inpu
  • 尝试写一个无锁的单链表,麻烦去除

    我正在尝试编写一个无锁单链表 最终一致性不是问题 有人遍历可能包含不正确项目的列表 我认为我正确添加了项目 循环和Interlocked CompareExchange 但我不知道如何删除节点 列表中的任何位置 因为我必须获取前一个项目并设
  • 如何在 PowerShell 中远程执行 ELEVATED 远程脚本

    我有两台服务器 serverA Windows 2003 服务器 serverB Windows 7的 ServerA包含一个带有批处理文件 deploy bat 的文件夹 需要从提升的 powershell 提示符执行该批处理文件 在Se
  • 在并行包中的 R 的 par*apply 函数内部使用 Rcpp 函数

    我试图了解背后发生的事情Rcpp sourceCpp 调用并行环境 最近 问题中部分解决了这个问题 在 Windows 上使用 parLapply 中的 Rcpp 函数 https stackoverflow com questions 2
  • 标准 C++ 中的共享递归互斥体

    有一个shared mutex http en cppreference com w cpp thread shared mutex计划用于 C 17 的课程 和shared timed mutex http en cppreference
  • C++并行排序

    我需要对存储在结构数组中的数据块进行排序 结构体没有指针 每个块都有其计数器编号以及数组中数据块与结构块相等的位置的坐标 例如 如果我们有一个数据数组 我们可以将其分为 4 个 NxN 块 那么在结构块的索引数组中我们有 4 个结构块 每个
  • Powershell v5.1 Invoke-RestMethod 并绕过代理

    我目前使用的是 Powershell V5 1 并且希望在 Invoke RestMethod 命令上绕过 Internet Explorer 代理 在 Powershell V6 中 有 NoProxy 选项 指示 cmdlet 将不使用
  • 如何停止 dbus gobject 循环

    我试图阻止gobject MainLoop 几秒钟后 我不知道是否可以为这种循环设置超时 这将是完美的 但我还没有找到 因此 我尝试通过线程来解决这个问题 但不幸的是 主循环阻塞了其他线程 这是我的代码 我正在使用 python 2 7 i
  • 堆栈本地对象的使用和对象的销毁之间是否存在“先发生”的关系?

    我看了赫伯 萨特的演讲 https channel9 msdn com Shows Going Deep Cpp and Beyond 2012 Herb Sutter atomic Weapons 2 of 2 https channel
  • Spring Batch 多线程

    我正在编写一个 Spring Batch 并希望在需要时对其进行扩展 我的 ApplicationContext 看起来像这样 Configuration EnableBatchProcessing EnableTransactionMan
  • 如何通知父线程所有子线程都已终止?

    我有一个控制台应用程序正在移植到 WPF 该应用程序有 3 个工作线程 在将一些输出结果打印到屏幕上之前 这些线程都连接到主线程 我的理解是 如果我尝试在 WPF 应用程序中执行相同的操作 GUI 将被阻止并且不会响应用户 那么如何通知父线
  • C# 并行与并行线程代码性能

    我一直在测试 System Threading Parallel 与线程的性能 我很惊讶地发现并行比线程花费更长的时间来完成任务 我确信这是由于我对并行的了解有限 我刚刚开始阅读 我想我会分享一些片段 如果有人可以向我指出并行代码比线程代码
  • boost::asio::io_service 是否保留处理程序的顺序?

    Does boost asio io service http www boost org doc libs release doc html boost asio reference io service html保证处理程序的调用顺序与
  • $Error 变量为 $Null 但 $_ 在 Catch 中包含错误

    我有 PS 模块 其中包含许多用于各个功能的脚本 还有一个 库 脚本 其中包含许多辅助函数 这些函数由模块中使用的函数调用 我们调用外部函数ReadWeb 并且它使用辅助函数ParseXML 本周我在内部助手中遇到了错误处理问题ParseX
  • 是否可以从 nuget powershell 设置项目的输出路径属性?

    我想从 nuget powershell 控制台设置 Visual Studio 项目属性 输出路径 怎么可能呢 我已经发现一篇博文 http weblogs asp net soever archive 2011 05 15 set th
  • 利用 SLURM 上的所有 CPU

    我想在集群上运行作业 不同节点上有不同数量的 CPU 我不知道哪些节点将分配给我 正确的选项是什么 以便作业可以在所有节点上创建与 CPU 一样多的任务 bin bash l SBATCH p normal SBATCH N 4 SBATC
  • Objective-C 2.0中的多线程问题

    我有我的主应用程序委托 其中包含一个返回对象的方法 该应用程序委托在主线程上运行 我还有一个在不同线程上运行的 NSOperation 除了希望有时能够在主线程上调用我的应用程序委托方法之外 我还需要从 NSOperation 线程中调用它
  • 将 Unicode 字符串转换为 ASCII

    我的字符串包含 ASCII 中未找到的字符 如 我需要一个函数将它们转换为可接受的内容 例如 a e i o u 这是因为我将根据这些字符串创建 IIS 网站 即我将使用它们作为域名 function Convert DiacriticCh
  • 如何捕获 Runnable 中的封闭范围

    我正在尝试对 a 进行一系列更新HandlerThread使用下面的类 但我有几个关于变量捕获在 Java 中如何工作的问题 1 Is ret通过引用从封闭范围捕获 2 Does this参考Runnable 或者是从封闭范围捕获的 bon
  • 分配内存时线程争用

    在 C 中 我运行了一个创建许多小对象的玩具代码 我知道最好应该避免这种情况 我只是想研究这个问题 对于创建的对象总量相同 一个线程的运行速度比每个处理器一个线程 Parallel For 的运行速度快 原子操作包括创建一个包含 20k 个

随机推荐

  • Fetch API 与 XMLHttpRequest

    我知道 Fetch API 使用Promises 并且它们都允许您向服务器发出 AJAX 请求 我读到 Fetch API 有一些额外的功能 这些功能在XMLHttpRequest 以及在 Fetch API polyfill 中 因为它基
  • 什么时候有人会使用工会?这是纯 C 时代的残余吗?

    我学到了 但并没有真正加入工会 我读过的每本 C 或 C 文本都会介绍它们 有时是顺便介绍 但它们往往很少给出关于为什么或在哪里使用它们的实际示例 工会何时在现代 甚至遗留 情况下有用 我唯一的两个猜测是 当您的工作空间非常有限时 或者当您
  • 如何将compile_commands.json与clang python绑定一起使用?

    我有以下脚本尝试打印给定 C 文件中的所有 AST 节点 当在具有简单包含的简单文件 同一目录中的头文件等 上使用它时 效果很好 usr bin env python from argparse import ArgumentParser
  • 如何在生产中禁用转储 symfony 功能

    如何禁用dump 功能 什么时候在生产环境中 如果我忘记了转储功能 它会崩溃并出现 500 错误 你应该删除dump 来自您的生产代码 它不必在那里 But as noted by Cerad 因为当您在签入之前忘记删除它们时可能会很烦人
  • 我如何告诉 PyCharm 参数的预期类型是什么?

    当涉及到构造函数 赋值和方法调用时 PyCharm IDE 非常擅长分析我的源代码并找出每个变量应该是什么类型 我喜欢它正确的时候 因为它为我提供了良好的代码完成和参数信息 并且如果我尝试访问不存在的属性 它会给我警告 但当涉及到参数时 它
  • 映射缩减组合器

    我有一个带有映射器 减速器和组合器的简单映射缩减代码 映射器的输出被传递到组合器 但是对于reducer来说 传递的不是combiner的输出 而是mapper的输出 请帮忙 Code package Combiner import jav
  • 如何在 React Native 中限制 google 登录到我公司的电子邮件域 (@company.com)?

    Question 阻止用户使用不以 mycompany com 结尾的电子邮件地址通过 Firebase Google 身份验证登录我们的内部应用程序的最佳方法是什么 Goal 防止用户使用错误的电子邮件登录应用程序 获取用户的公司电子邮件
  • Python pip install 以“命令错误,退出状态 1:...”结束

    我是 python 新手 我正在尝试运行一些需要一些库的基本代码 当我尝试安装库 例如 pip install matplotlib venn 时 我收到这个长错误 ERROR Command errored out with exit s
  • 如何使用 JavaScript 以编程方式打开文件选择器? [复制]

    这个问题在这里已经有答案了 可能的重复 在 JavaScript 中 我可以通过编程方式为文件输入元素触发 click 事件吗 我天真地尝试了以下方法 使用 JavaScript 以编程方式打开文件选择器 请参阅 fiddlehere
  • 每当 firebase 发生任何更改时,自动向所有用户发送通知 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 当 Firebase 发生更改时 如何通知所有用户 我不想手动执行此操作 您应该使用由实时数据库触发器触发的 Firebase Cloud Function 请参阅文档here
  • 如何启动Manifest中提到的不存在的Activity?

    我正在尝试开发一个 动态 Android 应用程序 动态是指我在清单中列出了一个在运行时 构建 的活动 我可以很好地构建所需的活动 但是 当我尝试启动它时 我的应用程序失败了 java lang RuntimeException Unabl
  • std::sort 会改变相等元素的相对顺序吗?

    标准是否通过使用 std sort 保证相等元素的顺序不会改变 呃 忘记了这个术语 或者我是否需要考虑替代解决方案来实现此目标 std sort不保证稳定 您试图想到的术语 正如你猜想的那样 std stable sort保证稳定 std
  • 如何更改AlertDialog中的文本颜色

    如何更改 AlertDialog 中的文本颜色
  • 如何使中心裁剪图像响应?

    基于一个现有答案 我已经设法居中裁剪图像 不过 我在使中心裁剪图像具有响应能力时遇到了困难 Question 当我减小网络浏览器窗口的大小时 中心裁剪图像不能很好地缩小 相反 它保持固定状态height and width and spil
  • 多重继承的虚方法表

    我正在读这篇文章 虚拟方法表 上面文章中的例子 class B1 public void f0 virtual void f1 int int in b1 class B2 public virtual void f2 int int in
  • 在组件状态下从数组中删除元素

    我正在尝试找到在组件状态下从数组中删除元素的最佳方法 因为我不应该修改this state直接变量 是否有比我这里更好的方法 更简洁 从数组中删除元素 onRemovePerson function index this setState
  • 断言失败:预测必须 >= 0,条件 x >= y 不按元素成立

    我正在运行一个多类模型 总共 40 个类 2000 个时期 该模型在 828 纪元之前运行良好 但在 829 纪元时它给了我一个 InvalidArgumentError 参见下面的屏幕截图 下面是我用来构建模型的代码 n cats 40
  • 获取 IndexedDB 中添加记录的键

    我在 IndexedDB 中有这段代码 var request objectStore add entryType entryType entryDate t 现在我想知道刚刚添加的这条记录的密钥 我该怎么做 I found 本文 和这个
  • iOS 版 GoogleMaps SDK 上是否存在标记动画?

    是否可以移动 旋转GMSMarker on GMSMapView有动画 1 2 中的补充是GMSMarker类有一个animated属性 我想你刚刚将其设置为YES 在通过设置其标记将标记添加到地图之前map属性 虽然我还没有尝试过 htt
  • 如何将原子计数器添加到 powershell ForEach -Parallel 循环

    在这个问题中 解释了如何添加到并发ThreadSafe集合Powershell 如何将结果添加到数组 ForEach Object Parallel 我有一个更简单的用例 我只想增加一个值 整数 是否可以在 Powershell 中使用某种