Files
cellxgene/server/gui/workers.py
2019-12-19 15:20:41 -08:00

97 lines
2.8 KiB
Python

from multiprocessing import Process
import time
import requests
from server.gui.utils import SiteReadySignals
class EmittingProcess(Process):
def __init__(self, parent_conn, child_conn, *arg, **kwargs):
super(EmittingProcess, self).__init__()
self.parent_conn = parent_conn
self.child_conn = child_conn
def run(self):
self.parent_conn.close()
def emit(self, signal_name, *args):
message = (signal_name, *args)
self.child_conn.send(message)
class Worker(EmittingProcess):
def __init__(self, parent_conn, child_conn, data_file, host, port, title,
engine_options, *args, **kwargs):
super(Worker, self).__init__(parent_conn, child_conn)
self.data_file = data_file
self.host = host
self.port = port
self.title = title
self.engine_options = engine_options
def run(self):
super(Worker, self).run()
if not self.data_file:
self.emit("finished")
return
from server.app.app import Server
from server.app.scanpy_engine.scanpy_engine import ScanpyEngine
# create server
try:
server = Server()
server.create_app()
except Exception as e:
self.emit("server_error", str(e))
self.emit("finished")
return
# load data
try:
args = {
"max_category_items": 100,
"diffexp_lfc_cutoff": 0.01,
"obs_names": None,
"var_names": None,
}
args.update(self.engine_options)
data = ScanpyEngine(self.data_file, args)
server.attach_data(data, self.title)
self.emit("ready")
except Exception as e:
self.emit("engine_error", str(e))
self.emit("finished")
return
# launch server
try:
server.app.run(host=self.host,
debug=False,
port=self.port,
threaded=True)
except Exception as e:
self.emit("server_error", str(e))
finally:
self.emit("finished")
class SiteReadyWorker:
def __init__(self, location):
super(SiteReadyWorker, self).__init__()
self.signals = SiteReadySignals()
self.location = location
def run(self):
session = requests.Session()
for i in range(90):
try:
session.head(self.location)
self.signals.ready.emit()
break
except requests.exceptions.ConnectionError:
time.sleep(1)
except Exception as e:
self.signals.error.emit(str(e))
self.signals.timeout.emit()