PowerShell ThreadJobs

PowerShell Jobs were introduced in PowerShell v2. While remoting got the attention in that release PowerShell Jobs are at least as important. PowerShell v6.1 preview 4 has introduced a new addition to the options for jobs – PowerShell ThreadJobs.

The real change is the addition of the Start-ThreadJob cmdlet. All other aspects of managing ThreadJobs are provided by the standard Jobs cmdlets.

PS>  Get-Command *Job | select name

Name
----
Debug-Job
Get-Job
Receive-Job
Remove-Job
Start-Job
Start-ThreadJob
Stop-Job
Wait-Job

When you use Start-Job the job is run in the background on a SEPARATE PROCESS. You can see the PowerShell processes stopping and starting if you monitor via Task manager or another instance of PowerShell.

ThreadJobs run on a separate THREAD within the same process. Apart for the cmdlet name you start a threadjob in the same way as a traditional background job.

PS>  Start-Job -ScriptBlock {Get-Service}

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
1      Job1            BackgroundJob   Running       True            localhost            Get-Service


PS>  Start-ThreadJob -ScriptBlock {get-Service}
Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
3      Job3            ThreadJob       NotStarted    False           PowerShell           get-Service

Notice the different job type name. The location changes from the localhost to PowerShell indicating its not a separate process.

To view jobs

PS>  Get-Job

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
1      Job1            BackgroundJob   Completed     True            localhost            Get-Service
3      Job3            ThreadJob       Completed     True            PowerShell           get-Service

To view results

PS>  Receive-Job -Id 3

Status   Name               DisplayName
------   ----               -----------
Running  AdobeARMservice    Adobe Acrobat Update Service
Stopped  AJRouter           AllJoyn Router Service
Stopped  ALG                Application Layer Gateway Service
Stopped  AppIDSvc           Application Identity
etc

To clean up jobs

PS>  Get-Job | Remove-Job

PS>  Get-Job

The advantage of ThreadJobs is that they are lighter on resource consumption because they are using a thread not a process. You can therefore run more ThreadJobs simultaneously compared to standard Jobs.

The disadvantage for ThreadJobs is that all of your jobs are running in the same process. If one crashes the process will most likely crash and you’ll lose everything.

The pros and cons of using ThreadJobs vs standard jobs must be addressed on a case by case basis. The ThreadJobs project has a bit more background – https://github.com/PaulHigin/PSThreadJob

ThreadJobs look to be a useful addition to the options for running background jobs.

This entry was posted in PowerShell v6. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s