コード例 #1
0
 def core(mpi: MpiContainer = None):
     app = QApplication(sys.argv)
     dbg.p("Application started", "main")
     window = MainWindow(mpi)
     window.show()
     dbg.p("Window shown", "main")
     return app.exec_()
コード例 #2
0
def initialise_slaves(mpi: MpiContainer):
    if mpi.is_slave:
        if mpi.debug_print:
            dbg.p(f"Process {mpi.rank}: Slave initialised", "MpiMethod")
        run_methods_parallel(None,
                             None,
                             mpi,
                             use_parallel=True,
                             shutdown=False)
コード例 #3
0
 def run(self) -> None:
     dbg.p("Thread running", "WorkerTest")
     assert self.func is not None, "Worker function not yet set"
     assert self.test_string is not None, "Worker parameter not set"
     try:
         self.func(self.test_string)  # This runs the function in the worker thread
     except:
         traceback.print_exc()
         exctype, value = sys.exc_info()[:2]
         self._signals.error.emit((exctype, value, traceback.format_exc()))
     finally:
         self._signals.test_finished.emit()
コード例 #4
0
    def btn_test_clicked(self):
        dbg.p("Button clicked", "MyWindow")
        new_text = "It works!"
        test_thread = TestThread(self.gui_cont.update_label, new_text, self.thread_finished)
        test_thread.run()

        # Testing TODO Turn this off
        ####################################
        test_list = []
        for i in range(25):
            test_list.append(Test(i))
        self.test_obj_list = test_list
        ####################################

        dbg.p("About to start MpiMethodThread", "MainWindow")
        parallel_thread = MpiMethodThread(obj_list=self.test_obj_list,
                                          method_name='change_a',
                                          mpi=self.mpi,
                                          finished_fn=self.thread_finished,
                                          all_returns_fn=self.parallel_change_a_returns,
                                          error_fn=self.parallel_change_a_error,
                                          use_parallel=USE_MPI)
        parallel_thread.run()
コード例 #5
0
    def run(self) -> None:
        if SHOW_DEBUG_COMMANDS:
            dbg.p(f"Running MpiMethod thread", "MpiMethodThread")
        assert self.obj_list is not None, "obj_list parameter has not been set"
        assert self.method_name is not None, "method_name parameter has not been set"
        if self.use_parallel:
            assert self.mpi is not None, "mpi parameter has not been set"

        assert all([hasattr(obj, self.method_name) for obj in self.obj_list]), \
            f"At least one of the objects do not have the method {method_name}"
        try:
            all_returns = run_methods_parallel(
                self.obj_list,
                self.method_name,
                self.mpi,
                use_parallel=self.use_parallel,
                shutdown=False)  # This runs the function in the worker thread
            self.sig.all_returns.emit(all_returns)
        except:
            traceback.print_exc()
            exctype, value = sys.exc_info()[:2]
            self.sig.error.emit((exctype, value, traceback.format_exc()))
        finally:
            self.sig.finished.emit()
コード例 #6
0
 def update_label(self, new_text):
     self.main_window.lblTest.setText(new_text)
     dbg.p("Label text updated", "GuiController")
コード例 #7
0
 def thread_finished(self):
     dbg.p("Thread finished!")
コード例 #8
0
def retire_slaves(mpi: MpiContainer):
    if mpi.is_main:
        run_methods_parallel(None, None, mpi, use_parallel=True, shutdown=True)
        if mpi.debug_print:
            dbg.p(f"Process {mpi.rank}: Slave retired", "MpiMethod")
コード例 #9
0
def run_methods_parallel(obj_list: List[Any] = None,
                         method_name: str = None,
                         mpi: MpiContainer = None,
                         use_parallel: bool = True,
                         shutdown: bool = None):

    assert use_parallel == (
        mpi is not None), "Mpi not provided, or provided erroneously"

    if use_parallel:
        if mpi.is_main:
            if not shutdown:
                scatter_data = make_groups(obj_list,
                                           method_name,
                                           mpi.size,
                                           append_bool=shutdown)
            else:
                scatter_data = []
                for _ in range(mpi.size):
                    scatter_data.append(('', '', shutdown))
        else:
            scatter_data = None

        scatter_data = mpi.comm.scatter(scatter_data, root=0)

        objs_4_parallel, method_name, shutdown = scatter_data
        if not shutdown:
            objs_return_parallel = []
            for obj in objs_4_parallel:
                if hasattr(obj, 'name'):
                    obj_name = getattr(obj, 'name')
                else:
                    obj_name = str(obj)
                if not hasattr(obj, method_name):
                    dbg.p(
                        f"Process {mpi.rank}: ERROR, {obj_name} does not have method {method_name}"
                    )
                    if mpi.is_slave:
                        run_methods_parallel(None, None, mpi, True, False)
                    return None
                else:
                    if mpi.debug_print:
                        dbg.p(
                            f"Process {mpi.rank}: Running '{method_name}' of {obj_name}"
                        )
                    obj_method = getattr(obj, method_name)
                    obj_return = obj_method()
                    objs_return_parallel.append(obj_return)

            gather_obj_returns = mpi.comm.gather(objs_return_parallel, root=0)
            if mpi.is_main:
                all_obj_returns = []
                for single_gather in gather_obj_returns:
                    all_obj_returns.extend(single_gather)
                return all_obj_returns
            if mpi.is_slave:
                run_methods_parallel(None, None, mpi, True, False)
                return None
        else:
            return None
    else:
        if not shutdown:
            all_obj_returns = []
            for obj in obj_list:
                obj_method = getattr(obj, method_name)
                obj_return = obj_method()
                all_obj_returns.append(obj_return)
            return all_obj_returns
        else:
            return None