In [ ]:
from __future__ import print_function

In [ ]:
class JobQueue:
    '''
    JobQueue Object for Starcat Multiprocessing.
    
    Submit new, recieve undone and report finished jobs to and from this object.
    
    A single job is a Python dict object.
    A job looks like this:
    
    somejob = {
        'id': int,
        'name': str,
        'func': [func_name, [args]]
    }
    '''
    def __init__(self):
        
        self.new_jobs = []
        self.sent_jobs = []
        self.done_jobs = []
        self.made = 0
        self.new = 0
        self.sent = 0
        self.done = 0
        
    def make(self):
        blank_job = {}
        self.made += 1
        blank_job['id'] = self.made
        blank_job['name'] = None
        blank_job['func'] = [None, []]
        return blank_job
        
    def add(self, job):
        self.new_jobs.append(job)
        self.new += 1
    
    def get(self):
        if not self.new:
            print('no jobs to to')
            job = self.make()
            return job
            
        job = self.new_jobs.pop()
        self.sent_jobs.append(job)
        self.new -= 1
        self.sent += 1
        return job
        
    def finish(self, job):
        completed_job = self.sent_jobs.pop(self.sent_jobs.index(job))
        self.done_jobs.append(completed_job)
        self.sent -= 1
        self.done += 1
    
    def report(self):
        print('\n==================')
        print('  JobList Report')
        print('------------------')
        print('made  :', self.made)
        print('ready :', self.new)
        print('doing :', self.sent)
        print('done  :', self.done)
        print('==================')

In [ ]:
def do_job(job, queue):
    print('\n==================')
    print('    Doing Job')
    print('------------------')
    print('id   :', job['id'])
    print('name :', job['name'])
    print('func :', job['func'][0])
    print('args :', job['func'][1])
    print('==================')
    
    if (job['func'][0]):
        
        job['func'][0](job['func'][1])
    
    queue.finish(job)
    print('done')

def call_back(args):
    x, y = args
    print('[call_back] call back')
    print('[call_back] args:', x, ',', y)
    print('[call_back] result', x + y)

In [ ]:
jq = JobQueue()
j1 = jq.make()
jq.report()

In [ ]:
j1['name'] = 'callback'
j1['func'] = [call_back, [2, 4]]
j1

In [ ]:
jq.add(j1)
jq.report()

In [ ]:
j2 = jq.get()
j2 == j1

In [ ]:
jq.report()

In [ ]:
do_job(j2, jq)

In [ ]:
jq.report()