in reply to Re^4: Trying to thread a daemon with threads and Thread::Queue
in thread Trying to thread a daemon with threads and Thread::Queue

This empty loop in your main thread:

while ($running) { # Keep running }

will consume as much cpu as the scheduler can give it. In essence, this means that when the main thread gets a timeslice, it will consume 100% of your cpu for its entire timeslice, doing absolutely nothing and preventing any other threads or processes getting a look in (unless you have multiple cores). Even if you have mutliple cores, this would just be 'busy work' consuming resources and power for no good reason.

At the very least you should slow that loop down:

sleep 1 while $running;

Beyond that, what you have seems way too complex--mixing as it does fork, threads and select--and I seriously doubt that it will perform any better than a simple, single-threaded process. Of course, you can run your tests and 'prove' me wrong and I cannot argue with you. And after all, it's your code and you will have to maintain it.


Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
"Too many [] have been sedated by an oppressive environment of political correctness and risk aversion."

Replies are listed 'Best First'.
Re^6: Trying to thread a daemon with threads and Thread::Queue
by jasmineaura (Initiate) on Sep 02, 2008 at 21:33 UTC
    the empty loop in the main thread:
    while ($running) { # Keep running }
    was to keep the script from ending (or code falling off the end of the script) soon after it spawns the threads... guess you're right..

    So what do you suggest I do to prevent the script from ending after the main thread spawns the threads ? sleep while ($running); ?
      So what do you suggest I do to prevent the script from ending after the main thread spawns the threads ? sleep while ($running); ?

      That is the simplest option.

      Better would be to not detach your threads and use join:

      my @threads; for (1..$listeners) { push @threads, threads->create(\&handleConnection, $main_sock) +; } $_->join for @threads;

      But for that to work, you need to ensure that all your threads will terminate at the appropriate time. That means making your $running variable shared, and then ensuring that it will be checked and acted upon within your select loop. And for that to work, you need to ensure that it will be check regularly, and not only when the select returns some IO activity, and that means using a timeout on the select. In turn, that will probably require making your sockets non-blocking.


      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.