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):
%{
% "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}
\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
manual/outro.tex Normal file
View File

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

View File

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

View File

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

19
task.py
View File

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

View File

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