Parallel running of functions

7,286

Solution 1

Pipe sends the output of one command to the next. You are looking for the & (ampersand). This forks processes and runs them in the background. So if you ran:

WatchDog & TempControl & GPUcontrol

It should run all three simultaneously.

Also when you run sudo bash /etc/rc.local I believe that is running them in series not in parallel (it waits for each command to finish before starting the next). That would be sort of like this:

WatchDog ; TempControl ; GPUcontrol

Command Separators

; semi-colon - command1 ; command2

This will execute command2 after command1 is finished, regardless of whether or not it was successful

& ampersand - command1 & command2

This will execute command1 in a subshell and execute command2 at the same time.

|| OR logical operator - command1 || command2

This will execute command1 and then execute command2 ONLY if command1 failed

&& AND logical operator - command1 && command2

This will execute command1 and then execute command2 ONLY if command1 succeeded.

Solution 2

Simply with GNU parallel:

export -f WatchDog && export -f TempControl && export -f GPUcontrol

parallel -j3 ::: WatchDog TempControl GPUcontrol

  • export -f <funcname> - export the function to be referred by parallel

  • -j N - run up to N jobs in parallel


Test case for demonstration:

function a () { seq -s' ' 1 10; sleep 10; }
function b () { echo {a..z}; sleep 5; }
function c () { echo {-100..-80}; sleep 10; }
export -f a && export -f b && export -f c
parallel --no-notice  -j3 ::: c b a

a b c d e f g h i j k l m n o p q r s t u v w x y z
-100 -99 -98 -97 -96 -95 -94 -93 -92 -91 -90 -89 -88 -87 -86 -85 -84 -83 -82 -81 -80
1 2 3 4 5 6 7 8 9 10
Share:
7,286

Related videos on Youtube

Zhyhalo Oleksandr
Author by

Zhyhalo Oleksandr

Updated on September 18, 2022

Comments

  • Zhyhalo Oleksandr
    Zhyhalo Oleksandr almost 2 years

    I have 3 functions, like

    function WatchDog {
    sleep 1
    
    #something
    }
    function TempControl {
    sleep 480
    
    #somthing
    }
    function GPUcontrol {
    sleep 480
    
    #somethimg
    }
    

    And i am runing it like

    WatchDog | TempControl | GPUcontrol
    

    This script is in rc.local file. So, logically it should run at automatically. The thing is that first function is doing fine. But second and third is not starting. But if I am starting it like

    sudo bash /etc/rc.local 
    

    that is working fine. What is the problem? The same thing if i am adding it to init.d directory.

  • Zhyhalo Oleksandr
    Zhyhalo Oleksandr almost 7 years
    So the "&" waitng them to finish, and ";" runing them immediately? Cos thats the endless loops, so they should start in one time.
  • jesse_b
    jesse_b almost 7 years
    I've edited my question with more detail about command separators.