// 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
*/