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