Advertisement
s243a

FreeWorkerFactory - rest_test6.py

Nov 14th, 2018
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.02 KB | None | 0 0
  1. class FreeWorkerFactory:
  2.  
  3.     #self.job = None #A freenet job
  4.     #self.g = None
  5.     #self.body = None
  6.     #self.OutputType =None
  7.    
  8.     def __init__(self,job_or_uri=None,**kw):
  9.         self.kw={}
  10.         self.kw['message']=kw.get('message',None)
  11.         self.kw['file']=kw.get(file,None)
  12.         self.loggerContainer=kw.get('loggerContainer',None)
  13.         #if self.loggerContainer is not None and self.node is not None:
  14.         #    self.loggerContainer.node=node
  15.         self.host=kw.get('host',"127.0.0.1")
  16.         self.port=self.kw.get('port',9481)
  17.         self.OutputType=self.kw.get('OutputType','HTML')
  18.         #selffcpPort,aBody,OutputType
  19.         if job_or_uri is not None:
  20.             if type(job_or_uri) is str:
  21.                 print("__init__" + "uri as input")
  22.                 if job_or_uri in jobs:                
  23.                     print("uri in jobs")
  24.                     self.job=jobs[job_or_uri]
  25.                 else:
  26.                     print("making job")
  27.                     node = fcp.FCPNode(fcpHost,verbosity='fcp.DETAIL',port=self.kw)
  28.                     val = self.kw['message']
  29.                     ksk = job_or_uri
  30.                     uri = "KSK@" + ksk
  31.                     node.put("KSK@"+ksk, data=val, mimetype="text/plain", verbosity=fcp.DETAIL)
  32.                     #self.job = node.get(uri, async=True)
  33.                     self.startCB = lambda: node.get(uri, async=True) #A start callback is safer than immediatly starting the job
  34.             else:
  35.                 print("__init__"+"job as input")
  36.                 print("Warning: Make sure that logger is created before job is started")
  37.                 self.job=job_or_uri
  38.                 self.startCB = lambda: job_or_uri #Best of luck with this! Job might proceed before logger is ready.
  39.         if self.OutputType == "HTML":
  40.             self.Brk="<br>"
  41.         elif self.OutputType == "UNIX":
  42.             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
  43.         self.loggerContainer=kw.get('loggerContainer',None)
  44.         self.body=kw.get('body',None)
  45.         if self.body is None:
  46.             try:
  47.                 self.body = self.loggerContainer.body  
  48.             except:
  49.                 print("Warning: body should be set in logger before freenet worker is created")
  50.                 self.body = queue.Queue()
  51.         self.greenlet=kw.get('greenlet',None)
  52.         if self.greenlet is None:
  53.             g = Greenlet(self.on_data)
  54.         try:
  55.             if self.loggerContainer.body is None:
  56.                 if self.body is not None:
  57.                     self.loggerContainer.body=self. body
  58.         except:
  59.             pass
  60.  
  61.         #self.setBody(kw.get('body',None)) # Replaced w/ the above code
  62.         self.startCB=kw.get('startCB',None) #Maybe I need to define a default start CB.    
  63.        
  64.     def on_data(self):
  65.         # we can poll the job
  66.         while True:
  67.             val, ready = self.loggerContainer.readBuf()
  68.             if ready:
  69.                 print val
  70.                 self.body.put(val)    
  71.             if self.loggerContainer.isComplete():
  72.                 print "Yay! job complete"
  73.                
  74.                 try:
  75.                     self.body.put(self.job.getResult()) #Returns the completion message.
  76.                 except Exception as inst:
  77.                     print(type(inst))    # the exception instance
  78.                     print(inst.args)     # arguments stored in .args
  79.                     print(inst)          # __str__ allows args to be printed directly,
  80.                     break        
  81.             else:
  82.                 print "Waiting" + datetime.now().strftime('%s(s) %m/%d/%Y')+self.Brk
  83.                 #self.body.put("Waiting" + datetime.now().strftime('%s(s) %m/%d/%Y')+self.Brk)
  84.                 time.sleep(0.001) #Yield control to other threads
  85.                 gevent.sleep(7) #This yields control to another greenlet
  86.         print("Apparently we are done!")
  87.         self.on_finish() #Maybe we can sequence the greenlets instead of putting this here.
  88.        
  89.     def on_finish(self):
  90.         self.body.put('</body></html>') #There should be a way to seperate these last two lines from this method.
  91.         self.body.put(StopIteration)
  92.     def header(self,start_response=None):
  93.         if self.OutputType == "HTML":
  94.             if start_response is not None:
  95.                 start_response('200 OK', [('Content-Type', 'text/html')])
  96.         self.body.put(' ' * 1000)
  97.         if self.OutputType == "HTML":
  98.             self.body.put("<html><body><h1>Current Time:</h1>")  
  99.            
  100.     def handle(self,environ=None, start_response=None,aBody=None):
  101.         lambda a: self.start(self,enviorn,start_response)
  102.         #g = Greenlet.spawn(on_data, body)
  103.     def setBody(self,aBody=None,aGreenlet=None):
  104.         if aBody is None:
  105.            if self.body is None:
  106.                print("setting body & greenlet. Normally we shouldn't do this here")
  107.                self.body = queue.Queue()
  108.                self.greenlet = Greenlet(self.on_data)
  109.                self.loggerContainer.body=self.body
  110.         else:
  111.            self.body = aBody
  112.         if aGreenlet is None:
  113.             if self.greenlet is None:
  114.                 self.greenlet = Greenlet(self.on_data)
  115.         else:
  116.             self.greenlet=aGreenlet
  117.         if self.loggerContainer.body is None:
  118.             self.loggerContainer.body=self.body
  119.     def start(self,environ=None, start_response=None,aBody=None,aGreenlet=None): # Not sure
  120.         #https://stackoverflow.com/questions/20824218/how-to-implement-someasyncworker-from-bottle-asynchronous-primer
  121.         #g = Greenlet.spawn(current_time, lambda a: on_data(body))
  122.         print("Set Body")
  123.         self.setBody(aBody)
  124.         print("header")
  125.         self.header(start_response)
  126.         self.job=self.startCB() #Maybe add the option for some key words (i.e. kw) to the startCB function
  127.         print("start")
  128.         self.greenlet.start()            
  129.         return self.body, self.greenlet
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement