Icon

This is the documentation for an older version of Qube. The latest version of the documentation can be found here: Qube

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

The next step is to understand basic dependencies 

The method used below is not the best method for dependencies but is a short introduction to the theory behind dependencies 

 

Feel free to download an run the below script as it setup a job that will :

  • Create a Parent "Sleep job" with a range of 60 
  • Create a Blocked Child "Sleep job" that waits for the Parent to complete before starting

 

Basic_Dependancy.py

 

Below is the code with commented explanations of its contents 

Code Block
#!/usr/bin/python
# Below are required imports for the script to run
import os, sys

# The below few lines of code are to determine the OS of the machine that your running 
# this script from and then define the location of the Qube! API
if 'QBDIR' in os.environ:
	sys.path.append('%s/api/python' % os.environ['QBDIR']);
elif os.uname()[0] == 'Darwin':
	sys.path.append('/Applications/pfx/qube/api/python');
elif os.uname()[0] == 'Linux':
	sys.path.append('/usr/local/pfx/qube/api/python');
else:
	sys.path.append('c:/program files/pfx/qube/api/python');


# The below line of code is to import the above defined Qube! API
import qb


# Below is the main function to run in this script 
def main():
    
    # ----------------Start creation of Parent Job----------------------------------------
    
    
    # Below creates an empty dictionary to be filled by the following lines of code 
    job = {}
    
    # Below defines the name of the Qube! job 
    job['name'] = 'python parent job'
    
    # Below defines how many Instances/subjobs the job is to spawn
    job['cpus'] = 1
    
    # Below defines the internal Qube! jobtype to be used to execute the job
    job['prototype'] = 'cmdrange'
    
    # The below parameters are explained further in the "Job submission with job package explained" page
    package = {}
    job['package'] = package
    job['package']['cmdline'] = 'sleep QB_FRAME_NUMBER'
	
	# Below defines the Agenda/Range of the job this will fill the Frames/Work section of the Qube! GUI
	# "0-60x10" is range 0-60 in chunks of 10 frames
    agendaRange = '0-60x10'
    
    # Below defines the internal command required to generate the agenda 
    agenda = qb.genframes(agendaRange)
    
    # Below defines the job details for the agenda 
    job['agenda'] = agenda
	
	# Below creates an empty list filled by the following lines of code
    listOfJobsToSubmit = []
    
	# Below evaluates the Parent job to be submitted and adds the to the above list
    listOfJobsToSubmit.append(job)
    
    # Below evaluates the Parent job to be submitted and adds the to the above list
    listOfSubmittedJobs = qb.submit(listOfJobsToSubmit)
    
    # Below calls the Parent job to be submitted and then prints the job ID
    parentJobID = listOfSubmittedJobs[0]['id']
    print 'parent: %d' % parentJobID
	
	# ----------------Start creation of Child Job----------------------------------------
	
	
	# Below creates an empty dictionary to be filled by the following lines of code
    job = {}
    
    # Below defines the name of the Qube! job
    job['name'] = 'python child job'
    
    # Below defines how many Instances/subjobs the job is to spawn
    job['cpus'] = 1
    
    # Below defines how many Instances/subjobs the job is to spawn
    job['prototype'] = 'cmdrange'
    
    # Below defines the jobs dependancy which links back to the first job in this script
    job['waitfor'] = parentJobID
    
    # The below parameters are explained further in the "Job submission with job package explained" page
    package = {}
    job['package'] = package
    job['package']['cmdline'] = 'sleep 20'
    
    # Below creates an empty list filled by the following lines of code
    listOfJobsToSubmit = []
    
    # Below evaluates the Child jobs to be submitted and adds the to the above list
    listOfJobsToSubmit.append(job)
    
    # Below calls the Child jobs to be submitted and then prints the job IDs
    listOfSubmittedJobs = qb.submit(listOfJobsToSubmit)
    for job in listOfSubmittedJobs:
        print 'child: %d' % job['id']

# Below runs the "main" function 
if __name__ == "__main__":
    main()
    sys.exit(0)

This job uses 

job['waitfor'] = parentJobID

To assign the dependancy to the child job so that it waits for the Parent job to complete 

Note: The child job will run no matter the outcome of the Parent job whether it fails or completes

You can create as many Child jobs as you wish
Try copying the child job and pasting it into the script again ... This will create 2 child jobs dependant on the completion of the parent  

 

A non edited version of this script can be found along with others :

  • Windows - C:\Program Files\pfx\qube\examples\jobSubmit03.py
  • OSX - /Application/pfx/qube/examples/jobSubmit03.py
  • Linux - /usr/local/pfx/qube/examples/jobSubmit03.py

Online - Python

Continue to Advanced Dependancies