www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - vibe.d is blocking threads

reply RuZzz <xruzzzz gmail.com> writes:
Code:
     import std.concurrency;
     import core.thread;
     //import vibe.http.client;      // If uncommented this line, 
the thread "worker" does not start
     void worker() {
         foreach (i; 0 .. 5) {
             Thread.sleep(500.msecs);
             writeln(i, " (worker)");
         }
     }

     void main() {
         spawn(&worker);

         foreach (i; 0 .. 5) {
             Thread.sleep(300.msecs);
             writeln(i, " (main)");
         }

         writeln("main is done.");
     }

How to launch threads with vibe.d? It doesn't work at both 
compilers.

- Gentoo Linux 64
- DMD64 D Compiler v2.069.0 (dub dependency)
- DMD64 D Compiler v2.071.0
- dub-0.9.24 USE="dmd-2_069"

dub.json:
{
   "name" : "axt-threads-json",
   "description" : "A minimal D bundle.",
   "targetType": "executable",
   "targetPath": "bin",
   "dependencies" : {
       "vibe-d": "~>0.7.28",
   },
   "configurations": [
             {
                 "name": "Debuger"
             },
             {
                 "name": "Release"
             }
     ]
}
Apr 27 2016
next sibling parent yawniek <dlang srtnwz.com> writes:
On Wednesday, 27 April 2016 at 13:00:29 UTC, RuZzz wrote:
 Code:
     import std.concurrency;
     import core.thread;
     //import vibe.http.client;      // If uncommented this 
 line, the thread "worker" does not start
     void worker() {
         foreach (i; 0 .. 5) {
             Thread.sleep(500.msecs);
             writeln(i, " (worker)");
         }
     }

 [...]
you should use the built in concurrency primitives vibe.d offers. especially runTask and runWorkerTask. see the vibe.d examples and http://vibed.org/features
Apr 27 2016
prev sibling parent reply Nicholas Wilson <iamthewilsonator hotmail.com> writes:
On Wednesday, 27 April 2016 at 13:00:29 UTC, RuZzz wrote:
 Code:
     import std.concurrency;
     import core.thread;
     //import vibe.http.client;      // If uncommented this 
 line, the thread "worker" does not start
     void worker() {
         foreach (i; 0 .. 5) {
             Thread.sleep(500.msecs);
             writeln(i, " (worker)");
         }
     }

     void main() {
         spawn(&worker);

         foreach (i; 0 .. 5) {
             Thread.sleep(300.msecs);
             writeln(i, " (main)");
         }

         writeln("main is done.");
     }

 How to launch threads with vibe.d? It doesn't work at both 
 compilers.
You don't. vibe.d uses fibers (aka green threads).
Apr 27 2016
parent Marc =?UTF-8?B?U2Now7x0eg==?= <schuetzm gmx.net> writes:
On Wednesday, 27 April 2016 at 23:30:10 UTC, Nicholas Wilson 
wrote:
 On Wednesday, 27 April 2016 at 13:00:29 UTC, RuZzz wrote:
 Code:
     import std.concurrency;
     import core.thread;
     //import vibe.http.client;      // If uncommented this 
 line, the thread "worker" does not start
     void worker() {
         foreach (i; 0 .. 5) {
             Thread.sleep(500.msecs);
             writeln(i, " (worker)");
         }
     }

     void main() {
         spawn(&worker);

         foreach (i; 0 .. 5) {
             Thread.sleep(300.msecs);
             writeln(i, " (main)");
         }

         writeln("main is done.");
     }

 How to launch threads with vibe.d? It doesn't work at both 
 compilers.
You don't. vibe.d uses fibers (aka green threads).
That doesn't matter. Native threads should work just fine, I'm using them without problems in a vibe.d app. Could it be that your main() function is never called at all? Try to insert a writeln() at the beginning. If so, this could be related to the "VibeDefaultMain" setting, see here: http://vibed.org/docs#custom-main
Apr 28 2016