How to break from parallel foreach?

Ali Çehreli acehreli at yahoo.com
Tue Feb 26 21:40:10 UTC 2019


On 02/26/2019 01:36 PM, Jordan Wilson wrote:
> On Tuesday, 26 February 2019 at 19:58:24 UTC, Andrey wrote:
>> Hello,
>> How to break from parallel foreach?
>> More general question - how to control such loop?
> 
> A basic way would be to use a flag:
> 
> shared stopWork=false;
> foreach (wordBag; wordBags.parallel) {
>      if (!stopWork) {
>          // do work
>          if (wordBag.canFind("myword")) stopWork=true
>      }
> }
> 
> I'd say it's probably not an elegant solution to "break" from parallel 
> forloops, but that's up to you to decide.
> 
> Jordan
> 
> 

I assume stopWork needs to be checked periodically, which requires an 
inner loop. So, I wrote the following. break breaks from the inner loop, 
which ends the outer loop and that's what makes sense in this case.


import std.stdio;
import std.random;
import std.parallelism;
import std.datetime;
import std.range;
import core.thread;
import std.conv;

enum workerCount = 10;
enum workTime = 5.seconds;

bool someEndCondition(int oneInN) {
   return uniform(0, oneInN) == 0;
}

void main() {
   int[][workerCount] arrays;

   foreach (i; workerCount.iota.parallel) {
     enum sleepTime = 100.msecs;
     enum loopCount = workTime / sleepTime;

     foreach (j; loopCount.iota) {
       if (someEndCondition(loopCount / 2)) {
         break;
       }
       arrays[i] ~= j.to!int;
       Thread.sleep(sleepTime);
     }
     writefln!"Worker %s finished"(i);
   }

   foreach (i; workerCount.iota) {
     writefln!"Worker %s:\n%(%s %)"(i, arrays[i]);
   }
}

Ali


More information about the Digitalmars-d-learn mailing list