[C# & Powershell] Paralelle verwerking

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Supermario16
  • Registratie: Mei 2004
  • Laatst online: 23:01
Ik ben bezig om een applicatie te maken die een powershell connectie naar 64 systemen moet gaan onderhouden. In deze applicatie komt een service te draaien waar weer andere applicaties tegenaan kunnen praten (noem het een Powershell Proxy). Het doel hiervan is om commando's tegen meerdere systemen uit te voeren en direct een weergave hiervoor te maken (dit wordt een WPF webapplicatie). Dit alles is voor intern gebruik ten behoeve van beheer.

Nu ben ik eigenlijk van plan een thread per connectie op te starten, zodat commando's ook tegelijkertijd ook uitgevoerd kunnen worden (deze moeten uit een queue gelepeld worden, maar zover ben ik nog niet). De reden hiervoor is dat sommige commando's lang kunnen duren voordat ze uitgevoerd zijn.

Eerst wil ik per thread een connectie opzetten en controleren of er een resultaat terug komt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// Connect
        public override Boolean Connect()
        {
            Pipeline pl = rs.CreatePipeline();
            pl.Commands.AddScript("Add-PSSnapin VMware.VimAutomation.Core");
            pl.Commands.AddScript("Set-ExecutionPolicy RemoteSigned -Scope CurrentUser");
            //pl.Commands.AddScript("Set-PowerCLIConfiguration -InvalidCertificateAction \"Ignore\" -Confirm:$false");
            pl.Commands.AddScript("Connect-VIServer -Verbose -Server " + sys.strName + " -Protocol https -User " + sys.strUsername + " -Password " + sys.strPassword);

            wOutput(pl);

            return true;
        }

// Execute command with output
        public override void wOutput(object oCommand)
        {
            Pipeline pl = (Pipeline)oCommand;
            // Return values
            List<PSObject> lPSOObjects = new List<PSObject>();

            // Event when pipeline is ready
            pl.Output.DataReady += Output_DataReady;

            // Invoke pipeline
            pl.Invoke();

        }

        // Data ready to read
        void Output_DataReady(object sender, EventArgs e)
        {
            PipelineReader<PSObject> output = sender as PipelineReader<PSObject>;

        }


Bovenstaande code wordt dus Parallel uitgevoerd (op dit moment nog door een simpele thread.start, maar als ik later verder ben in het TPL / .NET 4.5 veranderd dit nog), maar het Pipeline object kan hier slecht tegen. Op bovenstaande code wordt het commando gewoon niet gerunt (Wireshark laat geen verkeer zien richting de betreffende systemen). Als ik voor 1 systeem bovenstaande code in de main thread run wordt er netjes een verbinding opgezet.

* 1 Runspace per thread;
* Iedere call maakt een nieuwe pipeline aan.

Overigens ben ik al weken met bovenstaand probleem bezig (Iedere Google term die er bij zou komen ondertussen gehad).

Iemand enig idee hoe ik dit anders kan aanpakken?

Acties:
  • 0 Henk 'm!

  • __fred__
  • Registratie: November 2001
  • Laatst online: 10-07 07:28

Acties:
  • 0 Henk 'm!

  • Supermario16
  • Registratie: Mei 2004
  • Laatst online: 23:01
Zoals aangegeven heb ik Google ook al gebruikt. Het gaat me niet om asynchrone verwerking, maar paralel. Met deze methode kan ik de Pipeline wel asynchroon uitlezen, maar kan ik er nog maar 1 tegelijk asynchroon starten. Ik wil er juist meerdere tegelijk kunnen starten, of dit asynchroon is boeit me niet eens zoveel.

Acties:
  • 0 Henk 'm!

  • Supermario16
  • Registratie: Mei 2004
  • Laatst online: 23:01
Kleine kick:
code:
1
2
3
4
5
6
7
8
9
10
11
TR1 2012-11-27 16:13:53 Executing command: Get-Date
TR2 2012-11-27 16:13:53 Executing command: Get-Date
TR1 2012-11-27 16:13:53 Result: 27-11-2012 16:13:53
TR1 2012-11-27 16:13:53 Executing command: Add-PSSnapin VMware.VimAutomation.Core
TR2 2012-11-27 16:13:53 Result: 27-11-2012 16:13:53
TR2 2012-11-27 16:13:53 Executing command: Add-PSSnapin VMware.VimAutomation.Core
TR1 2012-11-27 16:13:54 Executing command: Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
TR1 2012-11-27 16:13:54 Executing command: Connect-VIServer -Verbose -Server vensup014.x.nl -Protocol https -User xx -Password xx
TR2 2012-11-27 16:13:55 Executing command: Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
TR2 2012-11-27 16:13:55 Executing command: Connect-VIServer -Verbose -Server vensup004.x.nl -Protocol https -User xx -Password xx
TR2 2012-11-27 16:14:03 Result: vensup004.x.nl


Bovenstaand is log data. Ik gebruik op dit moment twee threads (TR1 en TR2). De thread welke het commando het laatste uitvoerd, wordt ook daadwerkelijk uitgevoerd, het lijkt erop alsof de eerste thread wordt afgebroken.

Acties:
  • 0 Henk 'm!

  • STW
  • Registratie: Mei 2002
  • Laatst online: 15-07 23:17

STW

Moridin

Powershell laat het niet toe om meer dan 1 pipeline tegelijk actief te hebben (in de runspace).

Mogelijk heb je wat aan: http://ryan.witschger.net/?p=22

It is amazing what you can accomplish if you do not care who gets the credit.


Acties:
  • 0 Henk 'm!

  • Supermario16
  • Registratie: Mei 2004
  • Laatst online: 23:01
Uiteraard maak ik ook per thread een nieuwe runspace aan, alleen had ik inderdaad ook al het vermoeden dat deze niet helemaal threadsafe is. Het probleem met de oplossing in de door jou geboden link (had ik inderdaad ook al gevonden) is dat ik alle commando's in dezelfde runspace moet runnen. Dit wil zeggen dat ik al de verbinding naar de hosts in dezelfde runspace moet runnen, waardoor alle commando's die ik run tegen alle hosts gerunt worden, dit wil ik juist weer niet. Maar ik zal eens kijken of ik daar iets op kan verzinnen :).

Acties:
  • 0 Henk 'm!

  • __fred__
  • Registratie: November 2001
  • Laatst online: 10-07 07:28
Het schijnt dat je een runspacepool aan kunt maken.. Wellicht heb je hier wat aan, maar w.s. heb je die ook al gevonden:

http://newsqlblog.com/201...threading-with-runspaces/

Acties:
  • 0 Henk 'm!

  • Supermario16
  • Registratie: Mei 2004
  • Laatst online: 23:01
Inderdaad ook al gevonden. Probleem blijft dat ik per thread een runspace(pool) wil hebben, een pool zorgt er alleen voor dat ik binnen dezelfde thread meerdere runspaces kan gebruiken. Dit is bijvoorbeeld nuttig als queueing mechanisme in de thread.
Pagina: 1