heart is beating! tuk-tuk, tuk-tuk
Main engine has been finished, but needed to debug and refactoring
This commit is contained in:
		@@ -1,2 +0,0 @@
 | 
			
		||||
\chapter*{Введение}
 | 
			
		||||
 | 
			
		||||
@@ -261,36 +261,7 @@ default ‘foobar’”
 | 
			
		||||
 | 
			
		||||
Беря во внимание все вышеизложенное, такой результат может вернуть приложение-задача серверу на запрос информации (reltask -i):
 | 
			
		||||
 | 
			
		||||
%{
 | 
			
		||||
%        "title": "Example task",
 | 
			
		||||
%        "models": [
 | 
			
		||||
%            {
 | 
			
		||||
%                "title": "Example model",
 | 
			
		||||
%        "data": {
 | 
			
		||||
%                    "energy_max": "int choice [100] default 100 // Максимальная энергия",
 | 
			
		||||
%                    "energy_start": "int default 50 // Начальная энергия",
 | 
			
		||||
%                    "temp_start": "int default -15 // Температура в доме в момент приезда",
 | 
			
		||||
%                    "quota": "int default 200 // Количество работы для выполнения",
 | 
			
		||||
%                }
 | 
			
		||||
%                "methods": [
 | 
			
		||||
%                    {
 | 
			
		||||
%                        "title": "default",
 | 
			
		||||
%                        "data": {
 | 
			
		||||
%                                “temp_hour”: “int default -2 // Изменение температуры в час”
 | 
			
		||||
%                        }
 | 
			
		||||
%                    “results”:
 | 
			
		||||
%                {
 | 
			
		||||
%                        “data”: { “period”: “period”, “food”: “int” },
 | 
			
		||||
%“table”:
 | 
			
		||||
%{
 | 
			
		||||
%“head”: [“time title ‘Time’”, “int title ‘Energy’”, “int title ‘Temperature’”]
 | 
			
		||||
%}        
 | 
			
		||||
%                }
 | 
			
		||||
%}
 | 
			
		||||
%                        ]
 | 
			
		||||
%            }
 | 
			
		||||
%        ]
 | 
			
		||||
%}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Описание задачи состоит из списка моделей, которые включают в себя описание полей данных и методов. Методы тоже, как и модели, могут (и должны) включать в себя описание данных, которые будут использоваться управлением алгоритма.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										3
									
								
								trunk/manual/intro.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								trunk/manual/intro.tex
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
\chapter*{Введение}
 | 
			
		||||
 | 
			
		||||
О проникновении в нашу жизнь облачных технологий и возврату к терминальному режиму на современном уровне.
 | 
			
		||||
							
								
								
									
										4
									
								
								trunk/manual/listings/answer.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								trunk/manual/listings/answer.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
			
		||||
{
 | 
			
		||||
	"title": "test",
 | 
			
		||||
	"author": "Anton Vakhrushev"
 | 
			
		||||
}
 | 
			
		||||
@@ -4,9 +4,10 @@
 | 
			
		||||
 | 
			
		||||
\begin{document}
 | 
			
		||||
 | 
			
		||||
\include{00_intro}
 | 
			
		||||
\include{10_overview}
 | 
			
		||||
\include{20_for_user}
 | 
			
		||||
\include{30_for_prog}
 | 
			
		||||
\include{intro}
 | 
			
		||||
\include{overview}
 | 
			
		||||
\include{for_user}
 | 
			
		||||
\include{for_prog}
 | 
			
		||||
\include{outro}
 | 
			
		||||
 | 
			
		||||
\end{document}
 | 
			
		||||
							
								
								
									
										3
									
								
								trunk/manual/outro.tex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								trunk/manual/outro.tex
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
\chapter*{Заключение}
 | 
			
		||||
 | 
			
		||||
Спасибо за внимание!
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
\section{Задача оптимального управления}
 | 
			
		||||
 | 
			
		||||
В окружающем мире большинство процессов протекают непрерывно с течением времени. Вода не льется из под крана маленькими кубиками, она течет постоянной непрерывной струей, машина не едет "рывками", она плавно едет по извилистой змейке дороги.
 | 
			
		||||
В окружающем мире большинство процессов протекают непрерывно с течением времени. Вода не льется из под крана маленькими кубиками, она течет постоянной непрерывной струей, машина не едет <<рывками>>, она плавно едет по извилистой змейке дороги.
 | 
			
		||||
 | 
			
		||||
Но, тем не менее, почти все непрерывные процессы мы можем представить в качестве дискретных. Струю воды можно считать по каплям, а путь автомобиля по пройденным сантиметрам. Такой подход несколько неудобен для человека, который привык к плавности движений и форм. Однако, для вычислительных машин нет ничего лучше! Компьютеры все меряют отдельными значениями. Но если маленьких отдельных значений очень много, то они становятся похожи на непрерывный набор данных, поэтому, в сущности, какая в конечном счете разница что использовать: непрерывные функции или их дискретные аналоги?
 | 
			
		||||
 | 
			
		||||
@@ -21,6 +21,15 @@ import subprocess
 | 
			
		||||
 | 
			
		||||
import task
 | 
			
		||||
 | 
			
		||||
globallock = threading.Lock()
 | 
			
		||||
def WriteToLog(msg):
 | 
			
		||||
    with globallock:
 | 
			
		||||
        tm = str(datetime.datetime.now())
 | 
			
		||||
        msg = tm + '  ' + str(msg)
 | 
			
		||||
        #self.log.write(msg + '\n')
 | 
			
		||||
        print msg
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def GenerateId(data):
 | 
			
		||||
    import hashlib
 | 
			
		||||
    title  = data['title']
 | 
			
		||||
@@ -35,16 +44,19 @@ class LocalServer:
 | 
			
		||||
        self.max_workers = 2
 | 
			
		||||
 | 
			
		||||
        self.task_descrs = []
 | 
			
		||||
        self.task_queue = []
 | 
			
		||||
        self.jobs_queue = []
 | 
			
		||||
        self.log = None
 | 
			
		||||
 | 
			
		||||
        self.lock = threading.Lock()
 | 
			
		||||
        self.queue_lock = threading.Lock()
 | 
			
		||||
 | 
			
		||||
        # init actions
 | 
			
		||||
 | 
			
		||||
        self.log = open('log.txt', 'w')
 | 
			
		||||
        self.WriteToLog('local server initialized')
 | 
			
		||||
 | 
			
		||||
        worker = Worker(self.jobs_queue, self.queue_lock)
 | 
			
		||||
        worker.start()
 | 
			
		||||
 | 
			
		||||
    def Close(self):
 | 
			
		||||
        self.WriteToLog('local server closed\n')
 | 
			
		||||
 | 
			
		||||
@@ -76,8 +88,10 @@ class LocalServer:
 | 
			
		||||
            try:
 | 
			
		||||
                # нормализуем указанный путь
 | 
			
		||||
                line = os.path.normpath(line)
 | 
			
		||||
                line = os.path.abspath(line)
 | 
			
		||||
                # считываем данные через shell (важно для скриптовых языков)
 | 
			
		||||
                textdata = subprocess.check_output([line, '-i'], shell = True)
 | 
			
		||||
                textdata = subprocess.check_output([line, '-i'], shell = True,
 | 
			
		||||
                    cwd = os.path.dirname(line))
 | 
			
		||||
                # загружаем данные описания задачи
 | 
			
		||||
                data = json.loads(textdata)
 | 
			
		||||
                # провряем их на корректность
 | 
			
		||||
@@ -106,8 +120,11 @@ class LocalServer:
 | 
			
		||||
    def GetJob(self, index):
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    def AddJob(self, taskdescr, data):
 | 
			
		||||
        pass
 | 
			
		||||
    def AddJob(self, taskd, datadump):
 | 
			
		||||
        job = Job(taskd, datadump)
 | 
			
		||||
        with self.queue_lock:
 | 
			
		||||
            self.jobs_queue.append(job)
 | 
			
		||||
        WriteToLog('Job added')
 | 
			
		||||
 | 
			
		||||
#-------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
@@ -117,19 +134,22 @@ class Worker(threading.Thread):
 | 
			
		||||
        self.queue = queue
 | 
			
		||||
        self.lock = lock
 | 
			
		||||
        self.daemon = True
 | 
			
		||||
        WriteToLog('worker started')
 | 
			
		||||
 | 
			
		||||
    def FindNext(self):
 | 
			
		||||
        result = None
 | 
			
		||||
        for job in self.queue:
 | 
			
		||||
            if job.GetStatus() == JOB_STOP:
 | 
			
		||||
            if job.GetState() == JOB_READY:
 | 
			
		||||
                result = job
 | 
			
		||||
        return result
 | 
			
		||||
 | 
			
		||||
    def run(self):
 | 
			
		||||
        while True:
 | 
			
		||||
            job = None
 | 
			
		||||
            # найти следующее готовое к выполнению задание
 | 
			
		||||
            with self.lock:
 | 
			
		||||
                job = FindNext()
 | 
			
		||||
                job = self.FindNext()
 | 
			
		||||
            # и, если нашли, приступаем к выполнению
 | 
			
		||||
            if job:
 | 
			
		||||
                job.Start()
 | 
			
		||||
            else:
 | 
			
		||||
@@ -137,32 +157,57 @@ class Worker(threading.Thread):
 | 
			
		||||
 | 
			
		||||
#-------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
JOB_STOP     = 0
 | 
			
		||||
JOB_RUN      = 1
 | 
			
		||||
JOB_PAUSE    = 2
 | 
			
		||||
JOB_COMPLETE = 4
 | 
			
		||||
JOB_READY     = 0
 | 
			
		||||
JOB_RUNNING   = 1
 | 
			
		||||
JOB_STOPPED   = 2
 | 
			
		||||
JOB_COMPLETED = 3
 | 
			
		||||
 | 
			
		||||
class Job:
 | 
			
		||||
    def __init__(self, taskd, datadump):
 | 
			
		||||
        self.taskd   = taskd
 | 
			
		||||
        self.datad   = datadump
 | 
			
		||||
        self.status  = JOB_STOP
 | 
			
		||||
        self.state   = JOB_READY
 | 
			
		||||
        self.percent = 0.0
 | 
			
		||||
        self.result  = None
 | 
			
		||||
        self.proc    = None
 | 
			
		||||
 | 
			
		||||
        #self.
 | 
			
		||||
    def ProcessMsg(self, msg):
 | 
			
		||||
        WriteToLog(msg.strip())
 | 
			
		||||
 | 
			
		||||
    def Start(self):
 | 
			
		||||
        pass
 | 
			
		||||
        #try:
 | 
			
		||||
            self.state = JOB_RUNNING
 | 
			
		||||
            WriteToLog('Job started')
 | 
			
		||||
            execpath = self.taskd.execpath
 | 
			
		||||
            # запускаем процесс на выполнение
 | 
			
		||||
            self.proc = subprocess.Popen([execpath, '-r'], shell = True,
 | 
			
		||||
                stdin = subprocess.PIPE, stdout = subprocess.PIPE,
 | 
			
		||||
                stderr = subprocess.STDOUT, cwd = os.path.dirname(execpath))
 | 
			
		||||
            # передаем стартовые параметры
 | 
			
		||||
            istream = self.proc.stdin
 | 
			
		||||
            ostream = self.proc.stdout
 | 
			
		||||
            istream.write(self.datad + '\n')
 | 
			
		||||
            istream.flush()
 | 
			
		||||
            # пока процесс не завершится (или его не прибьют)
 | 
			
		||||
            while self.proc.poll() == None:
 | 
			
		||||
                try:
 | 
			
		||||
                    msg  = ostream.readline()
 | 
			
		||||
                    self.ProcessMsg(msg)
 | 
			
		||||
                except Exception, e:
 | 
			
		||||
                    WriteToLog('Income msg failed' + str(e))
 | 
			
		||||
            self.state = JOB_COMPLETED
 | 
			
		||||
            WriteToLog('Job done')
 | 
			
		||||
        #except:
 | 
			
		||||
            #WriteToLog('Job loop failed')
 | 
			
		||||
            #self.state = JOB_STOPPED
 | 
			
		||||
 | 
			
		||||
    def Stop(self):
 | 
			
		||||
        pass
 | 
			
		||||
        if self.proc and self.proc.poll() != None:
 | 
			
		||||
            self.proc.kill()
 | 
			
		||||
            WriteToLog('Job killed')
 | 
			
		||||
 | 
			
		||||
    def Pause(self):
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    def GetStatus(self):
 | 
			
		||||
        return self.status
 | 
			
		||||
    def GetState(self):
 | 
			
		||||
        return self.state
 | 
			
		||||
 | 
			
		||||
    def IsComplete(self):
 | 
			
		||||
        return self.GetStatus() == JOB_COMPLETE
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@ class TaskDescription:
 | 
			
		||||
        self.data       = data
 | 
			
		||||
        self.models     = []
 | 
			
		||||
        for label, data in self.data['models'].iteritems():
 | 
			
		||||
            self.models.append(DataDescription(self, label, data, self.server))
 | 
			
		||||
            self.models.append(DataDescription(None, label, data, self))
 | 
			
		||||
 | 
			
		||||
    def GetModelsDescriptions(self):
 | 
			
		||||
        return self.models
 | 
			
		||||
@@ -126,20 +126,23 @@ class DataDefinition:
 | 
			
		||||
            raise ValueError
 | 
			
		||||
 | 
			
		||||
    def PackParams(self):
 | 
			
		||||
 | 
			
		||||
        owner = self
 | 
			
		||||
        package = []
 | 
			
		||||
        owner = self
 | 
			
		||||
        while owner:
 | 
			
		||||
            data = {'label': owner.DD.GetLabel(), 'params': owner.params}
 | 
			
		||||
            package.append(data)
 | 
			
		||||
            owner = owner.parent
 | 
			
		||||
        package.reverse()
 | 
			
		||||
        return json.dumps(package)
 | 
			
		||||
 | 
			
		||||
        return package
 | 
			
		||||
    def Flush(self):
 | 
			
		||||
        server = self.DD.taskd.server
 | 
			
		||||
        datadump = self.PackParams()
 | 
			
		||||
        server.AddJob(self.DD.taskd, datadump)
 | 
			
		||||
 | 
			
		||||
#-------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import server, json
 | 
			
		||||
import server, json, time
 | 
			
		||||
from pprint import pprint
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
@@ -153,11 +156,15 @@ def main():
 | 
			
		||||
    model = models[0]
 | 
			
		||||
 | 
			
		||||
    mdef = DataDefinition(model)
 | 
			
		||||
    #pprint(mdef.DD.data)
 | 
			
		||||
    pprint(mdef.DD.data)
 | 
			
		||||
    mdef['x'] = 20
 | 
			
		||||
 | 
			
		||||
    p = mdef.PackParams()
 | 
			
		||||
    pprint(p)
 | 
			
		||||
 | 
			
		||||
    mdef.Flush()
 | 
			
		||||
    mdef.Flush()
 | 
			
		||||
 | 
			
		||||
    time.sleep(15)
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    main()
 | 
			
		||||
 
 | 
			
		||||
@@ -3,22 +3,27 @@
 | 
			
		||||
import sys
 | 
			
		||||
import json
 | 
			
		||||
import os
 | 
			
		||||
import time
 | 
			
		||||
 | 
			
		||||
def write(msg):
 | 
			
		||||
    sys.stdout.write(msg + '\n')
 | 
			
		||||
    sys.stdout.flush()
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
 | 
			
		||||
#    try:
 | 
			
		||||
 | 
			
		||||
    d = os.path.dirname(__file__)
 | 
			
		||||
    os.chdir(d)
 | 
			
		||||
 | 
			
		||||
    if sys.argv[1] == '-i':
 | 
			
		||||
        with open('testt.js') as f:
 | 
			
		||||
        with open('testt.json') as f:
 | 
			
		||||
            d = json.load(f)
 | 
			
		||||
            print json.dumps(d, indent = 2)
 | 
			
		||||
            write(json.dumps(d, indent = 2))
 | 
			
		||||
 | 
			
		||||
    elif sys.argv[1] == '-r':
 | 
			
		||||
        textdata = raw_input()
 | 
			
		||||
        data = json.loads(data)
 | 
			
		||||
        #data = json.loads(data)
 | 
			
		||||
        for i in xrange(10):
 | 
			
		||||
            time.sleep(0.5)
 | 
			
		||||
            write(json.dumps({ "hello": "world" }))
 | 
			
		||||
 | 
			
		||||
#    except:
 | 
			
		||||
#        print 'Error!'
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user