heart is beating! tuk-tuk, tuk-tuk

Main engine has been finished, but needed to debug and refactoring
This commit is contained in:
anwinged 2012-04-07 06:22:54 +00:00
parent 13bae5159e
commit 5e70da47dd
13 changed files with 106 additions and 69 deletions

View File

@ -1,2 +0,0 @@
\chapter*{Введение}

View File

@ -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
View File

@ -0,0 +1,3 @@
\chapter*{Введение}
О проникновении в нашу жизнь облачных технологий и возврату к терминальному режиму на современном уровне.

View File

@ -0,0 +1,4 @@
{
"title": "test",
"author": "Anton Vakhrushev"
}

View File

@ -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
View File

@ -0,0 +1,3 @@
\chapter*{Заключение}
Спасибо за внимание!

View File

@ -2,7 +2,7 @@
\section{Задача оптимального управления} \section{Задача оптимального управления}
В окружающем мире большинство процессов протекают непрерывно с течением времени. Вода не льется из под крана маленькими кубиками, она течет постоянной непрерывной струей, машина не едет "рывками", она плавно едет по извилистой змейке дороги. В окружающем мире большинство процессов протекают непрерывно с течением времени. Вода не льется из под крана маленькими кубиками, она течет постоянной непрерывной струей, машина не едет <<рывками>>, она плавно едет по извилистой змейке дороги.
Но, тем не менее, почти все непрерывные процессы мы можем представить в качестве дискретных. Струю воды можно считать по каплям, а путь автомобиля по пройденным сантиметрам. Такой подход несколько неудобен для человека, который привык к плавности движений и форм. Однако, для вычислительных машин нет ничего лучше! Компьютеры все меряют отдельными значениями. Но если маленьких отдельных значений очень много, то они становятся похожи на непрерывный набор данных, поэтому, в сущности, какая в конечном счете разница что использовать: непрерывные функции или их дискретные аналоги? Но, тем не менее, почти все непрерывные процессы мы можем представить в качестве дискретных. Струю воды можно считать по каплям, а путь автомобиля по пройденным сантиметрам. Такой подход несколько неудобен для человека, который привык к плавности движений и форм. Однако, для вычислительных машин нет ничего лучше! Компьютеры все меряют отдельными значениями. Но если маленьких отдельных значений очень много, то они становятся похожи на непрерывный набор данных, поэтому, в сущности, какая в конечном счете разница что использовать: непрерывные функции или их дискретные аналоги?

View File

@ -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
View File

@ -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()

View File

@ -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!'