Dispycos非阻塞线程

时间:2018-11-26 12:54:44

标签: python multithreading distributed-computing dispy

我正在扩展threading.Thread以这种方式实现并行处理:

class WorkerGenerico(threading. Thread):
    """ Clase con la funcionalidad principal de un worker genérico: Se inicia en un thread y se para de forma graceful
        mediante join (bloqueante). Adicionalmente permite enviar la orden de detención de forma no bloqueante mediante
        "gracefull_stop", aunque no garantiza que se detenga el thread.
        Args:
            input_q (:class:`queue.Queue`): Cola de entrada de datos al proceso. No deberia usarse, esta por escaoalabilidad.
            input_q (:class:`queue.Queue`): Cola por la que el programa envía sus resultados.

        Attributes:
            input_q (:class:`queue.Queue`): Cola de salida de entrada de datos (comandos?)
            input_q (:class:`queue.Queue`): Cola de salida de datos (resultados)
            stoprequest (:class:`threading.Event`): Condición de parada
        Raises:
    """
    def __init__(self, input_q, output_q):
        super(WorkerGenerico, self).__init__()
        self.input_q = input_q
        self.output_q = output_q
        self.stoprequest = threading.Event()

    # def run(self):
    #    pass

    def join(self, timeout=None):
        self.stoprequest.set()
        super(WorkerGenerico, self).join(timeout)

    def gracefull_stop(self):
        self.stoprequest.set()
        self.transcriptor.join()

    def has_orden_parada(self):
        return self.stoprequest.is_set()

    def _enviar_msg(self, texto):
        return self.output_q.put((self.name, texto))

    def _recibir_msg(self, timeout=0.5):
        return self.input_q.get(True, timeout)

    def _imprimir_error(self, texto):
        eprint(texto)

    def _tratar_excepcion(self, excepcion):
        self._imprimir_error("Excepcion no controlada: {0}".format(excepcion))
        eprint("Error inesperado:", sys.exc_info()[0])

然后,当从外部执行task.start()时,.run成为一个非阻塞循环。 _enviar_msg和_recibir_msg使用队列与主进程进行通信,并在运行过程中发送中间结果或接收新参数。我的主要软件没有更改,也不需要等待它运行。

现在我需要扩展,一台计算机还不够,所以我决定使用dispycos,但是它们似乎有阻塞的任务,只允许我发送一个任务一次,然后它等待所有任务完成。

如果我运行dispycos client example 8,事实证明它永远不会超出范围

pycos.Task(client_proc, computation, 10 if len(sys.argv) < 2 else int(sys.argv[1]))

为了给您一些背景知识,我的任务运行了23-72小时。他们的CPU需求是动态的,我可能会手动控制每个节点有多少。

我希望能够在第一时间将源分发到每台计算机,以避免类定义不必要地在网络上飞过。

如果可能的话,我想将每种任务类型的所有传入消息读入同一队列。现在,我将相同的output_q传递给每个过程(以及它们的自定义input_q来接收定向命令)以实现此目标,并且就像一个魅力一样。

0 个答案:

没有答案