#目的
オンライン学習システムを開発時、システム各部分を違う言語で開発し、
データ交信の手段としてMongoDBが有効です。
#MongoDBの導入
下記記事をご参照ください。
個人的にはMongoDB Compass よりRobo 3T が使いやすいと感じています。
#MongoDBの設計
本例では下記のようにDBを作成する。
cmdに入るデータはjavaとか他言語により書き込まれる動作指示です。
responseには他言語への学習結果報告です。
#学習本体
train.py
from pymongo import MongoClient
import sys
import time
break_flag = False
end_flag = False
client = MongoClient('localhost', 27017)
db = client.j_p
def train(epoch):
global break_flag,end_flag
for e in range(epoch):
#通常train
print("in train")
#Train結果を上のレーヤへ送信
resp = db.cmd_respons.find_one ({"_id":"5c4be3e86b95412bca9230a6"})
old_resp = resp["response"]
new_resp = 890 #疑似結果
db.cmd_respons.update_one({'response': old_resp},
{'$set': {'response': new_resp}})
if (break_flag == True):
print("break in train.py ")
#sys.stdout.flush()
break
end_flag = True
print("exit in train.py")
time.sleep(2)
#学習制御
control.py
from pymongo import MongoClient
import train
import threading
import time
client = MongoClient('localhost', 27017)
db = client.j_p
epoch = 100000
def control():
cmd = db.cmd_respons.find_one({"_id":"5c4be3c56b95412bca923099"})
if(cmd["cmd"] == "start"):
#Trainを起動する
thread = threading.Thread(target=train.train, args=(epoch,))
thread.daemon = True
thread.start()
while True:
#上のレーヤと交信
cmd = db.cmd_respons.find_one({"_id":"5c4be3c56b95412bca923099"})
if(cmd["cmd"] == "stop"):
train.break_flag = True
print("break by stop command")
time.sleep(2)
break
if train.end_flag == True:
break
time.sleep(2)
print("exit in control.py")
if __name__ == '__main__':
control()