// https://dlang.org/phobos/std_parallelism.html alias uint8 = ubyte; alias uint64 = ulong; import std.stdio; import std.concurrency : spawn; import std.parallelism : parallel, defaultPoolThreads; import core.time : Duration, dur; import core.thread : Thread; uint64 fact(uint64 n){ return fact(n, 1); } uint64 fact(uint64 n, uint64 a){ if(n == 0){ return a; }else{ return fact(n - 1, n * a); } } //void test4_worker(uint8 n){ void test4_worker(int n){ writeln("started worker = ", n); while(true){ //Thread.sleep(dur!"seconds"(120)); //Thread.sleep(dur!"seconds"(3)); auto v20 = fact(20); //writeln("worker = ", n, " fact 20 = ", v20); // this is sync lock (( } Thread.sleep(dur!"seconds"(3)); writeln("stopped worker = ", n); } void test4_spawner(){ //uint8 i = 10; // 10 = 1.8 Mb RAM // 255 = 2.9 Mb RAM // 1000 = 6.1 Mb RAM // 10_000 = 47.9 Mb RAM // 100_000 = 180.3 -> 434.4 Mb RAM ,, 161.8 -> 607.7 Mb RAM //int i = 100_000; // fails //int i = 30_000; //int i = 35_000; // fails /* while(i > 0){ spawn(&test1_worker, i); i--; } */ writeln("defaultPoolThreads = ", defaultPoolThreads()); // 19 defaultPoolThreads(5); writeln("defaultPoolThreads = ", defaultPoolThreads()); // 5 //int[] ints = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; int[] ints = [1, 2, 3, 4, 5]; foreach(i, ref num; parallel(ints)){ test4_worker(num); } } /* > make run ./vtest2 // 21 threads for 10 elems // 21 threads for 5 elems too // 7 threadf for 5 elems // writeln locking */