Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class FreeWorkerFactory:
- #self.job = None #A freenet job
- #self.g = None
- #self.body = None
- #self.OutputType =None
- def __init__(self,job_or_uri=None,**kw):
- self.kw={}
- self.kw['message']=kw.get('message',None)
- self.kw['file']=kw.get(file,None)
- self.loggerContainer=kw.get('loggerContainer',None)
- #if self.loggerContainer is not None and self.node is not None:
- # self.loggerContainer.node=node
- self.host=kw.get('host',"127.0.0.1")
- self.port=self.kw.get('port',9481)
- self.OutputType=self.kw.get('OutputType','HTML')
- #selffcpPort,aBody,OutputType
- if job_or_uri is not None:
- if type(job_or_uri) is str:
- print("__init__" + "uri as input")
- if job_or_uri in jobs:
- print("uri in jobs")
- self.job=jobs[job_or_uri]
- else:
- print("making job")
- node = fcp.FCPNode(fcpHost,verbosity='fcp.DETAIL',port=self.kw)
- val = self.kw['message']
- ksk = job_or_uri
- uri = "KSK@" + ksk
- node.put("KSK@"+ksk, data=val, mimetype="text/plain", verbosity=fcp.DETAIL)
- #self.job = node.get(uri, async=True)
- self.startCB = lambda: node.get(uri, async=True) #A start callback is safer than immediatly starting the job
- else:
- print("__init__"+"job as input")
- print("Warning: Make sure that logger is created before job is started")
- self.job=job_or_uri
- self.startCB = lambda: job_or_uri #Best of luck with this! Job might proceed before logger is ready.
- if self.OutputType == "HTML":
- self.Brk="<br>"
- elif self.OutputType == "UNIX":
- self.Brk="" #We won't use "\n" since print automatically generates the \n. Write can be used instead if one wants to explicitly use the /n
- self.loggerContainer=kw.get('loggerContainer',None)
- self.body=kw.get('body',None)
- if self.body is None:
- try:
- self.body = self.loggerContainer.body
- except:
- print("Warning: body should be set in logger before freenet worker is created")
- self.body = queue.Queue()
- self.greenlet=kw.get('greenlet',None)
- if self.greenlet is None:
- g = Greenlet(self.on_data)
- try:
- if self.loggerContainer.body is None:
- if self.body is not None:
- self.loggerContainer.body=self. body
- except:
- pass
- #self.setBody(kw.get('body',None)) # Replaced w/ the above code
- self.startCB=kw.get('startCB',None) #Maybe I need to define a default start CB.
- def on_data(self):
- # we can poll the job
- while True:
- val, ready = self.loggerContainer.readBuf()
- if ready:
- print val
- self.body.put(val)
- if self.loggerContainer.isComplete():
- print "Yay! job complete"
- try:
- self.body.put(self.job.getResult()) #Returns the completion message.
- except Exception as inst:
- print(type(inst)) # the exception instance
- print(inst.args) # arguments stored in .args
- print(inst) # __str__ allows args to be printed directly,
- break
- else:
- print "Waiting" + datetime.now().strftime('%s(s) %m/%d/%Y')+self.Brk
- #self.body.put("Waiting" + datetime.now().strftime('%s(s) %m/%d/%Y')+self.Brk)
- time.sleep(0.001) #Yield control to other threads
- gevent.sleep(7) #This yields control to another greenlet
- print("Apparently we are done!")
- self.on_finish() #Maybe we can sequence the greenlets instead of putting this here.
- def on_finish(self):
- self.body.put('</body></html>') #There should be a way to seperate these last two lines from this method.
- self.body.put(StopIteration)
- def header(self,start_response=None):
- if self.OutputType == "HTML":
- if start_response is not None:
- start_response('200 OK', [('Content-Type', 'text/html')])
- self.body.put(' ' * 1000)
- if self.OutputType == "HTML":
- self.body.put("<html><body><h1>Current Time:</h1>")
- def handle(self,environ=None, start_response=None,aBody=None):
- lambda a: self.start(self,enviorn,start_response)
- #g = Greenlet.spawn(on_data, body)
- def setBody(self,aBody=None,aGreenlet=None):
- if aBody is None:
- if self.body is None:
- print("setting body & greenlet. Normally we shouldn't do this here")
- self.body = queue.Queue()
- self.greenlet = Greenlet(self.on_data)
- self.loggerContainer.body=self.body
- else:
- self.body = aBody
- if aGreenlet is None:
- if self.greenlet is None:
- self.greenlet = Greenlet(self.on_data)
- else:
- self.greenlet=aGreenlet
- if self.loggerContainer.body is None:
- self.loggerContainer.body=self.body
- def start(self,environ=None, start_response=None,aBody=None,aGreenlet=None): # Not sure
- #https://stackoverflow.com/questions/20824218/how-to-implement-someasyncworker-from-bottle-asynchronous-primer
- #g = Greenlet.spawn(current_time, lambda a: on_data(body))
- print("Set Body")
- self.setBody(aBody)
- print("header")
- self.header(start_response)
- self.job=self.startCB() #Maybe add the option for some key words (i.e. kw) to the startCB function
- print("start")
- self.greenlet.start()
- return self.body, self.greenlet
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement