1

I have a problem where my For loop will not get rid of my PrintTemporary monitor, and it means I end up with loads and loads of progress bars.

(* set number of kerlnels to use *) 
numkernel = 4; 
(* how high do you want to count to? *) 
iterations = 15; 

(* for monitoring progress over multiple kernels *) 
progress[current_, total_] :=

 Column[{StringRiffle[ToString /@ {current, total}, " of "], 
   ProgressIndicator[current, {0, total}]}, Alignment -> Center]

(* counting very slowly *) 
takeyourtime[howmany_, kernelnum_] := Module[{}, 
  For[i = 1, i <= howmany, i++,
    status[[Key[$KernelID]]] = <|
      "Kernel" -> "Kernel " <> ToString@kernelnum, 
      "Monitor" -> progress[i, howmany]|>;
    Pause[1];
    ];
  ]

(* will count up to iterations, k times over numkernel kernels *) 
For[k = 1, k <= 3, k = k + 1;,

 Print[k]; 

 (*clean up*) 
 Clear[parrallel];

 (* how to divide the counting *) 
 division = Round[iterations/numkernel];

 (* remainder on the first kernel *) 
 divisionmod = 
  Round[iterations/numkernel] + Mod[iterations, numkernel];

 (* put the first evaluation in, with the remainder*) 
 parrallel = {Hold[ParallelSubmit[{takeyourtime[divisionmod, 1]}]]};

 (*for number of kernels, set up the parrallel stuff *) 
 For[i = 2, i <=  numkernel, i++ , 
  parrallel = 
   Append[parrallel, 
    Hold[ParallelSubmit[{takeyourtime[division, 1]}]]];
  (*to this, so we can add i and do the monitoring better, 
  have to be careful when expressions are evaluated, 
  want to keep that for the parralel bit *) 
  parrallel[[i]] = 
   StringReplace[ToString[parrallel[[i]]], 
    ", i]" -> ", " <> ToString[i] <> "]"];
  parrallel[[i]] = ToExpression[parrallel[[i]]];
  ] ;

 LaunchKernels[];

 (* the monitoring variable we will print *) 
 status = 
  Association @@ 
   ParallelTable[$KernelID -> <|"Kernel" -> "", 
      "Monitor" -> ""|>, {i, $KernelCount}];

 (*distribute the required definitions around the kernels *) 
 DistributeDefinitions[takeyourtime, division, divisionmod ];

 SetSharedVariable[status];

 (* this is the monitoring bit *) 
 PrintTemporary[
  Dynamic[Row[
    Riffle[Column[#, Alignment -> Center] & /@ 
      Query[Values, Values]@Select[#"Monitor" =!= "" &]@status, 
     Spacer[5]]]]];

 (*execute the parralel process *) 
 results = WaitAll[ReleaseHold[parrallel]];

 CloseKernels[];
 ]

enter image description here

Tomi
  • 4,366
  • 16
  • 31

1 Answers1

1

I managed to work a partial solution by putting

NotebookDelete[NextCell[]];
NotebookDelete[NextCell[]];

In the end of the For loop.

Tomi
  • 4,366
  • 16
  • 31