diff options
Diffstat (limited to 'launcher.py')
-rw-r--r-- | launcher.py | 89 |
1 files changed, 80 insertions, 9 deletions
diff --git a/launcher.py b/launcher.py index 4798429..32ec12b 100644 --- a/launcher.py +++ b/launcher.py @@ -1,25 +1,96 @@ import os -from subprocess import * +import subprocess import threading +import socket +import time + +HEADER = 64 +PORT = 6011 +SERVER = 'localhost' +ADDR = (SERVER, PORT) +FORMAT = 'utf-8' +DISCONNECT_MESSAGE = b'!DISSCONNECT' + +server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +server.bind(ADDR) + +def establish_connection(mutable = {}): + server.listen() + conn, addr = server.accept() + mutable['conn'] = conn + mutable['addr'] = addr + return conn, addr + +def send_msg(conn, msg): + data = bytes(msg, FORMAT) + data += b' ' * (HEADER - len(data)) + conn.send(data) + +def recv_msg(conn): + msg = conn.recv(HEADER).strip() + return msg def execute_source_file(file_name): ext = file_name.split('.') if ext[1] == 'py': cmd = 'Python' - elif ext[1] == 'r': cmd = 'RScript' - run( + elif ext[1] == 'r': cmd = 'Rscript' + + subprocess.run( f'{cmd} {file_name}', cwd = os.getcwd(), start_new_session = True ) + print(f'{file_name} executed') + +def launch_and_connect(file_name, CONN): + connect_ = threading.Thread(target=establish_connection, args=[CONN]) + launch_ = threading.Thread(target=execute_source_file, args=[file_name]) + + connect_.start() + launch_.start() + connect_.join() + + conn = CONN['conn'] + addr = CONN['addr'] + CONN['launch_'] = launch_ + return conn, addr + +def disconnect_and_close(CONN): + conn = CONN['conn'] + launch_ = CONN['launch_'] + send_msg(conn, '!DISCONNECT') + print(f'closing {CONN["addr"]}') + launch_.join() + print(f'closed {CONN["addr"]}') + conn.close() + +CONN_R = {} +CONN_PY = {} +src_fil_r = threading.Thread(target=launch_and_connect, args=['source_file.r', CONN_R]) +src_fil_py = threading.Thread(target=launch_and_connect, args=['source_file.py', CONN_PY]) +disc_r = threading.Thread(target=disconnect_and_close, args=[CONN_R]) +disc_py = threading.Thread(target=disconnect_and_close, args=[CONN_PY]) + +src_fil_r.run() +src_fil_py.run() + +conn_r = CONN_R['conn'] +conn_py = CONN_PY['conn'] -src_fil_py = threading.Thread(target=execute_source_file, args=['source_file.py']) -src_fil_r = threading.Thread(target=execute_source_file, args=['source_file.r']) +msg = recv_msg(conn_r) +print(msg) +msg = recv_msg(conn_py) +print(msg) -src_fil_r.start() -src_fil_py.start() +for i in range(255): + msg = f'message {i}' + send_msg(conn_r, msg) + send_msg(conn_py, msg) -src_fil_r.join() -src_fil_py.join() +disc_r.start() +disc_py.start() +disc_r.join() +disc_py.join() print("end launcher") |