Powershell 并发任务 | Runspace 线程 | 结果获取

news2024/12/28 21:48:43

介绍

在 PowerShell 中进行多任务处理(Multithreading 或 Parallel Processing)主要目的是提高脚本的执行效率和性能。对于需要处理大量数据或执行多个独立任务的脚本来说尤其有用。

  1. 提高性能: 多任务处理允许脚本同时执行多个任务,从而加快整体执行速度。对于需要处理大型数据集或执行耗时的操作时尤为重要。

  2. 充分利用多核处理器: 现代计算机配备了多核处理器。通过多任务处理,可以充分发挥这些多核处理器的性能,提高整体计算能力。

  3. 并行执行独立任务: 在某些情况下,脚本需要执行多个相互独立的任务。多任务处理使得这些任务可以同时进行,而不是依次执行,提高脚本的效率。

  4. 提高响应性: 脚本需要响应用户输入或事件,多任务处理可以确保主线程(通常是用户界面线程)保持响应,而后台线程处理其他任务。

  5. 资源分配: 多任务处理允许更灵活地分配系统资源,例如内存、CPU 时间等,以满足不同任务的需求。

Runspace

在 PowerShell 中,使用 PowerShell Jobs、Runspace 等技术来实现多任务处理。
本文使用 Runspace,Runspace 是 PowerShell 中用于实现多任务处理的一种机制,其优势主要体现在以下几个方面:

  1. 轻量级: Runspace 是一种轻量级的线程池技术,相较于创建完整的 PowerShell 进程或 Runspace 进程,资源开销较小。在一个脚本中创建多个 Runspace,以执行并发任务而不过度消耗系统资源。

  2. 资源隔离: 每个 Runspace 拥有独立的 PowerShell 运行环境和内存空间,意味着一个 Runspace 的异常不会影响到其他 Runspace,提供了更好的资源隔离。

  3. 更好的性能: Runspace 同时执行多个任务,充分利用多核处理器和系统资源,从而提高整体脚本执行的性能。在需要处理大量数据或执行复杂任务时,Runspace 能够更高效地完成工作。

  4. 适用于并行处理: Runspace 是适用于并行处理的一种机制,同时执行多个任务,不是按顺序一个一个地执行。这对于需要并行处理独立任务的脚本非常有帮助。

  5. 异步执行: Runspace 可以用于实现异步执行任务,脚本可以继续执行而无需等待所有任务完成。这对于需要同时进行多个长时间运行的任务时尤为有用。

示例

# 开始时间
$StartTime = Get-Date
# 处理任务
$Worker = {
    param($Filename)
    Write-Host "Processing $filename"
    Start-Sleep -Seconds 1 # Doing some work....
    $Item = New-Item -Name $Filename
    Write-Output $Item.FullName
}
# 最大并发
$MaxRunspaces = 10

try {
	# 线程池
    $RunspacePool = [runspacefactory]::CreateRunspacePool(1, $MaxRunspaces)
    $RunspacePool.Open()

    $Jobs = New-Object System.Collections.ArrayList

    $Filenames = @("file1.txt", "file2.txt", "file3.txt", "file4.txt", "file5.txt", "file6.txt", "file7.txt", "file8.txt", "file9.txt", "file10.txt", "file11.txt")

    foreach ($File in $Filenames) {
        Write-Host "Creating runspace for $File"
        $PowerShell = [powershell]::Create()
        $PowerShell.RunspacePool = $RunspacePool
        $PowerShell.AddScript($Worker).AddArgument($File) | Out-Null
        
        $JobObj = New-Object -TypeName PSObject -Property @{
            Runspace   = $PowerShell.BeginInvoke()
            PowerShell = $PowerShell  
        }

        $Jobs.Add($JobObj) | Out-Null
    }

    while ($Jobs.Runspace.IsCompleted -contains $false) {
        Write-Host (Get-date).Tostring() "Still running..."
        Start-Sleep 1
    }
}
finally {
	# 始终关闭进程池
    $RunspacePool.Close()
}
# 结束时间
$endTime = Get-Date
# 运行时间
Write-Host "The script runs for Total time (s):$(($endTime - $StartTime).TotalSeconds)"
# 任务对象信息
$Jobs.powershell.Streams
$Jobs.powershell.haderrors

image.png
image.png

逻辑介绍

代码逻辑jiesh:

  1. 定义 Worker 脚本块:

    • $Worker 脚本块是一个用于处理文件的脚本块。接受一个文件名参数,输出处理后的结果。
  2. 设置并发 Runspaces 数量:

    • $MaxRunspaces 变量定义最大 Runspaces 数量,即同时处理的最大任务数。
  3. 创建 Runspace 池:

    • 使用 [runspacefactory]::CreateRunspacePool 创建 Runspace 池,设置最小和最大 Runspaces 数量,并打开池。
  4. 创建并发任务:

    • 使用 foreach 循环遍历文件名数组 $Filenames
    • 每个文件名创建一个 PowerShell 对象 $PowerShell
    • $Worker 脚本块添加到 PowerShell 中,并通过 AddArgument 传递文件名参数。
    • 使用 BeginInvoke 异步启动 PowerShell,返回一个 Runspace 对象。
    • 创建一个包含 Runspace 和 PowerShell 对象的自定义对象 $JobObj,并将其添加到 $Jobs 数组中。
  5. 等待任务完成:

    • 使用 while 循环检查所有任务是否完成。循环条件是检查 $Jobs.Runspace.IsCompleted 数组,确保所有任务都完成。
    • 在循环中使用 Start-Sleep 暂停一秒钟,以避免过于频繁的检查。
  6. 关闭 Runspace 池:

    • finally 块中关闭 Runspace 池,确保资源的正确释放。
  7. 输出结果和错误信息:

    • 输出所有任务的 Streams(输出、错误等)。
    • 输出是否有错误发生($Jobs.powershell.haderrors)。

这段代码通过并发处理多个文件,每个文件在一个独立的 Runspace 中执行,最终输出各任务的结果和错误信息。并发处理可以提高处理大量文件时的效率。

Ending


~喜欢的话,请收藏 | 关注(✪ω✪)~
~万一有趣的事还在后头呢,Fight!!(o^-^)~''☆ミ☆ミ~……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1420295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Centos7 双机单网卡安装 OpenStack

虚拟机配置 1:准备虚拟机2台,配置如下 openstack master----192.168.20.205 2cpu,8G内存,200G硬盘,网络桥接方式--静态IP----单网卡 node1计算节点---192.168.20.215 2cpu,8G内存,200G硬盘&a…

数据结构【初阶】--排序(归并排序和基数排序)

目录 一.归并排序的非递归写法 1.思想应用 2.代码基本实现 (1)单趟归并逻辑 (2)多趟&#xff08;循环&#xff09;的控制条件 ① 迭代条件&#xff1a;i2*gap ② 结束条件&#xff1a;i(或i<n-2*gap)<> (3)代码展示 ① 单趟逻辑 ②整体逻辑 3.优化代码…

《HTML 简易速速上手小册》第6章:HTML 语义与结构(2024 最新版)

文章目录 6.1 语义化标签的重要性6.1.1 基础知识6.1.2 案例 1&#xff1a;使用 <article>, <section>, <aside>, <header>, 和 <footer>6.1.3 案例 2&#xff1a;构建带有嵌套语义化标签的新闻网站6.1.4 案例 3&#xff1a;创建一个带有 <mai…

HAL库之看门狗

一、看门狗的介绍 &#xff08;1&#xff09;独立看门狗(IWDG)&#xff1a;独立看门狗由专用的低速时钟(LSI)驱动&#xff0c;即使主时钟发生故障它也仍然有效。因此叫独立&#xff0c;同时因此在低功耗模式下不能启动看门狗&#xff0c;低功耗详情见之前文章。IWDG比WWDG更精…

macos Android平台签名证书(.keystore)

一、申请appid的使用说明&#xff08;有appid的请忽略申请appid&#xff09; 创建应用 申请的appid在源码视图填写后会自动生成一个对应的包名 ⚠️注意&#xff1a;申请appid的时候应用名称和项目名称保持一致。 二、 Android如何使用自用证书进行打包 1.找到安装jdk的路径…

D25XB100-ASEMI整流桥D25XB100参数、封装、规格

编辑&#xff1a;ll D25XB100-ASEMI整流桥D25XB100参数、封装、规格 型号&#xff1a;D25XB100 品牌&#xff1a;ASEMI 正向电流&#xff08;Id&#xff09;&#xff1a;25A 反向耐压&#xff08;VRRM&#xff09;&#xff1a;1000V 正向浪涌电流&#xff1a;350A 正向…

win10设置重启自动运行

大家知道windows系列非常不稳定&#xff0c;经常更新&#xff0c;蓝屏&#xff0c;死机等。 所以服务部署在上面会经常挂掉。当他重启后&#xff0c;对应的服务要是没有开启成功就会出问题。 所以我们需要在重启后启动。 1.首先把你想要的执行的程序写一个bat脚本 这个是我的…

C语言第十三弹---VS使用调试技巧

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 VS调试技巧 1、什么是bug 2、什么是调试&#xff08;debug&#xff09;&#xff1f; 3、Debug和Release​编辑​ 4、VS调试快捷键 4.1、环境准备 4.2、调试…

学习Spring的第十二天

Bean基本注解开发 创建一个空Maven项目: 创建完如下 之后在pom文件配置坐标 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.7</version></depe…

翻译: GPT-4 Vision征服LLM幻觉hallucinations 升级Streamlit六

GPT-4 Vision 系列: 翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式一翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式二翻译: GPT-4 Vision静态图表转换为动态数据可视化 升级Streamlit 三翻译: GPT-4 Vision从图像转换为完全可编辑的表格 升级St…

Windows系统安装OpenSSH+VS Code结合内网穿透实现远程开发

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…

Netty-ChannelHandle的业务处理

ChannelHandle结构 ChannelHandler基础接口 基础接口里面定义的基础通用方法。增加handler&#xff0c;移除handler&#xff0c;异常处理。 ChannelInboundHandler public interface ChannelInboundHandler extends ChannelHandler {/*** The {link Channel} of the {link Ch…

学习PyQt5

1、布局之后&#xff0c;无法移动对象到指定区域&#xff0c;无法改变对象大小。 原因&#xff1a;因为CtrlA选中了整个窗口&#xff0c;然后布局的时候就相当于整个窗口都按照这种布局&#xff0c;如选了水平布局&#xff0c;按钮一直在中间&#xff0c;无法拖到其它位置。 …

如何安装配置HFS并实现无公网ip远程访问本地电脑共享文件

文章目录 前言1.下载安装cpolar1.1 设置HFS访客1.2 虚拟文件系统 2. 使用cpolar建立一条内网穿透数据隧道2.1 保留隧道2.2 隧道名称2.3 成功使用cpolar创建二级子域名访问本地hfs 总结 前言 在大厂的云存储产品热度下降后&#xff0c;私人的NAS热度快速上升&#xff0c;其中最…

那些年与指针的情仇(二)---二级指针指针与数组的那点事函数指针

关注小庄 顿顿解馋(&#xff61;&#xff65;∀&#xff65;)&#xff89;&#xff9e; 欢迎回到我们的大型纪录片《那些年与指针的爱恨情仇》&#xff0c;在本篇博客中我们将继续了解指针的小秘密&#xff1a;二级指针&#xff0c;指针与数组的关系以及函数指针。请放心食用&a…

【Kafka】服务器Broker与Controller详解

这里写自定义目录标题 Broker概述Broker总体工作流程Broker重要参数 Controller为什么需要Controller具体作用数据服务Leader选举选举流程脑裂问题羊群效应触发leader选举 Broker 概述 Kafka服务实例&#xff0c;负责消息的持久化、中转等功能。一个独立的Kafka 服务器被就是…

[N-135]基于springboot,vue高校图书馆管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;gradle-5.6.4 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatisred…

【HarmonyOS应用开发】ArkUI 开发框架-基础篇-第一部分(七)

常用基础组件 一、组件介绍 组件&#xff08;Component&#xff09;是界面搭建与显示的最小单位&#xff0c;HarmonyOS ArkUI声明式开发范式为开发者提供了丰富多样的UI组件&#xff0c;我们可以使用这些组件轻松的编写出更加丰富、漂亮的界面。组件根据功能可以分为以下五大类…

Web 开发 9:Django 框架基础

在本篇文章中&#xff0c;我们将深入探讨 Django 框架的基础知识。Django 是一个功能强大且流行的 Python Web 框架&#xff0c;它提供了一套完整的工具和功能&#xff0c;用于开发高效、可扩展的 Web 应用程序。 什么是 Django&#xff1f; Django 是一个基于 Python 的免费…

STM32——中断系统和外部中断EXTI

一、中断 1.1中断系统 中断系统是管理和执行中断的逻辑结构&#xff1b; 1.2中断 系统在执行主程序过程中&#xff0c;出现了特定的触发条件&#xff08;触发源&#xff09;&#xff0c;系统停止执行当前程序&#xff0c;转而去执行中断程序&#xff0c;执行完毕后&#xf…