gpt4 book ai didi

powershell - 如何从列表中异步调用多个 URL

转载 作者:行者123 更新时间:2023-12-04 10:49:26 34 4
gpt4 key购买 nike

我有几十万个 URL 需要调用。这些是对应用程序服务器的调用,应用程序服务器将处理它们并将状态代码写入表。我不需要等待响应(成功/失败),只需要服务器收到请求。我还希望能够指定一次可以运行多少并发作业,因为我还没有计算出tomcat可以处理多少并发请求。

到目前为止,这是我所得到的,基本上是从其他人尝试做类似的事情中得到的,而不是通过 url 调用。文本文件在其自己的行中包含每个 url。网址如下所示:

http://webserver:8080/app/mwo/services/create?server=ServerName&e1user=admin&newMWONum=123456&sourceMWONum=0&tagNum=33-A-1B

和代码:
$maxConcurrentJobs = 10
$content = Get-Content -Path "C:\Temp\urls.txt"

foreach ($url in $content) {
$running = @(Get-Job | Where-Object { $_.State -eq 'Running' })
if ($running.Count -le $maxConcurrentJobs) {
Start-Job {
Invoke-WebRequest -UseBasicParsing -Uri $using:url
}
} else {
$running | Wait-Job -Any
}
Get-Job | Receive-Job
}

我遇到的问题是每个“工作”都会出现 2 个错误,我不知道为什么。当我转储 url 数组 $content 时,它看起来很好,当我一一运行我的 Invoke-WebRequest 时,它们可以正常工作。
126    Job126          BackgroundJob   Running       True            localhost            ...                
Invalid URI: The hostname could not be parsed.
+ CategoryInfo : NotSpecified: (:) [Invoke-RestMethod], UriFormatException
+ FullyQualifiedErrorId : System.UriFormatException,Microsoft.PowerShell.Commands.InvokeRestMethodComman
d
+ PSComputerName : localhost

Invalid URI: The hostname could not be parsed.
+ CategoryInfo : NotSpecified: (:) [Invoke-RestMethod], UriFormatException
+ FullyQualifiedErrorId : System.UriFormatException,Microsoft.PowerShell.Commands.InvokeRestMethodComman
d
+ PSComputerName : localhost

任何帮助或替代实现将不胜感激。我愿意不使用 powershell,但我仅限于 Windows 7 桌面或 Windows 2008 R2 服务器,我可能会使用 url 中的 localhost 在服务器本身上运行最终脚本以减少网络延迟。

最佳答案

使用 Jobs 会产生大量开销,因为每个新 Job 都会产生一个新进程。

使用Runspaces反而!

$maxConcurrentJobs = 10
$content = Get-Content -Path "C:\Temp\urls.txt"

# Create a runspace pool where $maxConcurrentJobs is the
# maximum number of runspaces allowed to run concurrently
$Runspace = [runspacefactory]::CreateRunspacePool(1,$maxConcurrentJobs)

# Open the runspace pool (very important)
$Runspace.Open()

foreach ($url in $content) {
# Create a new PowerShell instance and tell it to execute in our runspace pool
$ps = [powershell]::Create()
$ps.RunspacePool = $Runspace

# Attach some code to it
[void]$ps.AddCommand("Invoke-WebRequest").AddParameter("UseBasicParsing",$true).AddParameter("Uri",$url)

# Begin execution asynchronously (returns immediately)
[void]$ps.BeginInvoke()

# Give feedback on how far we are
Write-Host ("Initiated request for {0}" -f $url)
}

如链接的 ServerFault 帖子中所述,您还可以使用更通用的解决方案,例如 Invoke-Parallel , 基本上就是做上面的

关于powershell - 如何从列表中异步调用多个 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31524786/

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