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

Reply via email to