Moved to python threads (#745)

So we could use daemon threads
This commit is contained in:
Charlotte Weaver
2019-05-03 14:48:48 -07:00
committed by GitHub
parent 0aa0f641ab
commit 98b63fa9ea
3 changed files with 24 additions and 17 deletions
+18 -11
View File
@@ -1,6 +1,7 @@
# flake8: noqa F403, F405 # flake8: noqa F403, F405
import sys
from os.path import splitext, basename from os.path import splitext, basename
import sys
import threading
from cefpython3 import cefpython as cef from cefpython3 import cefpython as cef
from PySide2.QtCore import * from PySide2.QtCore import *
@@ -9,22 +10,19 @@ from PySide2.QtWidgets import *
from server.app.app import Server from server.app.app import Server
from server.gui.browser import CefWidget, CefApplication from server.gui.browser import CefWidget, CefApplication
from server.gui.workers import DataLoadWorker, ServerRunWorker from server.gui.workers import DataLoadWorker, ServerRunWorker
from server.gui.utils import WINDOWS, LINUX, MAC from server.gui.utils import WINDOWS, LINUX, MAC, FileLoadSignals
from server.utils.constants import MODES from server.utils.constants import MODES
# Configuration # Configuration
# TODO remember this or calculate it? # TODO remember this or calculate it?
WIDTH = 1024 WIDTH = 1024
HEIGHT = 768 HEIGHT = 768
# noinspection PyUnresolvedReferences # noinspection PyUnresolvedReferences
class MainWindow(QMainWindow): class MainWindow(QMainWindow):
def __init__(self): def __init__(self):
super(MainWindow, self).__init__(None) super(MainWindow, self).__init__(None)
self.thread_pool = QThreadPool()
self.cef_widget = None self.cef_widget = None
self.data_widget = None self.data_widget = None
self.server = Server() self.server = Server()
@@ -91,7 +89,8 @@ class MainWindow(QMainWindow):
def runServer(self): def runServer(self):
worker = ServerRunWorker(self.server.app, host="127.0.0.1", port=8000) worker = ServerRunWorker(self.server.app, host="127.0.0.1", port=8000)
self.thread_pool.start(worker) self.httpd = threading.Thread(target=worker.run, daemon=True)
self.httpd.start()
def clearBrowserReferences(self): def clearBrowserReferences(self):
# Clear browser references that you keep anywhere in your # Clear browser references that you keep anywhere in your
@@ -102,7 +101,6 @@ class MainWindow(QMainWindow):
class LoadWidget(QFrame): class LoadWidget(QFrame):
def __init__(self, parent): def __init__(self, parent):
super(LoadWidget, self).__init__(parent=parent) super(LoadWidget, self).__init__(parent=parent)
# Init layout # Init layout
self.MAX_CONTENT_WIDTH = 500 self.MAX_CONTENT_WIDTH = 500
load_ui_layout = QVBoxLayout() load_ui_layout = QVBoxLayout()
@@ -153,19 +151,28 @@ class LoadWidget(QFrame):
load_ui_layout.setStretch(2, 10) load_ui_layout.setStretch(2, 10)
self.setLayout(load_ui_layout) self.setLayout(load_ui_layout)
self.signals = FileLoadSignals()
self.signals.selectedFile.connect(self.createScanpyEngine)
def updateEmbedding(self, idx): def updateEmbedding(self, idx):
self.embedding_selection = MODES[idx] self.embedding_selection = MODES[idx]
def createScanpyEngine(self, file_name):
worker = DataLoadWorker(file_name, self.embedding_selection)
worker.signals.result.connect(self.onDataSuccess)
worker.signals.error.connect(self.onDataError)
self.load_worker = threading.Thread(target=worker.run, daemon=True)
self.load_worker.start()
def onLoad(self): def onLoad(self):
options = QFileDialog.Options() options = QFileDialog.Options()
# options |= QFileDialog.DontUseNativeDialog # options |= QFileDialog.DontUseNativeDialog
file_name, _ = QFileDialog.getOpenFileName(self, file_name, _ = QFileDialog.getOpenFileName(self,
"Open H5AD File", "", "H5AD Files (*.h5ad)", options=options) "Open H5AD File", "", "H5AD Files (*.h5ad)", options=options)
self.title = splitext(basename(file_name))[0] self.title = splitext(basename(file_name))[0]
worker = DataLoadWorker(file_name, self.embedding_selection) if file_name:
worker.signals.result.connect(self.onDataSuccess) self.signals.selectedFile.emit(file_name)
worker.signals.error.connect(self.onDataError)
self.window().thread_pool.start(worker)
def onDataSuccess(self, data): def onDataSuccess(self, data):
self.window().server.attach_data(data, self.title) self.window().server.attach_data(data, self.title)
+4
View File
@@ -19,3 +19,7 @@ class WorkerSignals(QObject):
finished = Signal() finished = Signal()
error = Signal(str) error = Signal(str)
result = Signal(object) result = Signal(object)
class FileLoadSignals(QObject):
selectedFile = Signal(str)
+2 -6
View File
@@ -1,18 +1,15 @@
import traceback import traceback
from PySide2.QtCore import QRunnable, Slot
from server.gui.utils import WorkerSignals from server.gui.utils import WorkerSignals
class DataLoadWorker(QRunnable): class DataLoadWorker():
def __init__(self, data_file, layout="umap", *args, **kwargs): def __init__(self, data_file, layout="umap", *args, **kwargs):
super(DataLoadWorker, self).__init__() super(DataLoadWorker, self).__init__()
self.data_file = data_file self.data_file = data_file
self.layout = layout self.layout = layout
self.signals = WorkerSignals() self.signals = WorkerSignals()
@Slot()
def run(self): def run(self):
if not self.data_file: if not self.data_file:
self.signals.finished.emit() self.signals.finished.emit()
@@ -39,13 +36,12 @@ class DataLoadWorker(QRunnable):
self.signals.finished.emit() self.signals.finished.emit()
class ServerRunWorker(QRunnable): class ServerRunWorker():
def __init__(self, app, host, port, *args, **kwargs): def __init__(self, app, host, port, *args, **kwargs):
super(ServerRunWorker, self).__init__() super(ServerRunWorker, self).__init__()
self.app = app self.app = app
self.host = host self.host = host
self.port = port self.port = port
@Slot()
def run(self): def run(self):
self.app.run(host=self.host, debug=False, port=self.port, threaded=True) self.app.run(host=self.host, debug=False, port=self.port, threaded=True)