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