Použití vláken v rámci uzlu distribuované sítě

Užitečné odkazy

Dnes si ukážeme, jak je možné použít Thread v rámci objektu Node v knihovně distsim.

Broadcast

Minule bylo za úkol naprogramovat jednoduchý broadcast. Každý proces odeslal zprávu všem uzlům a poté počkal na zprávy od všech ostatních uzlů.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def node_code():
    # get current node object
    node = current_process()

    # get logger
    logger = node.get_logger()

    logger.info(f"Starting node.")

    # send msg to each output pipelines
    for node_name in node.out_pipes.keys():
        node.send_to(node_name, f"Msg from node {node.name}")

    # recieve msg from each input pipelines
    for node_name in node.in_pipes:
        msg = node.recv_from(node_name)
        logger.info(f"Recieved msg: {msg}")

    time.sleep(2)

    logger.info(f"Shutting down.")

Dnes upravíme toto řešení, aby se příjem a odeslání zpráv mohlo prokládat. To je možné za pomoci dvou vláken. První vlákno se stará o odesílání a druhé o přijímaní zpráv.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def node_code():
    # get current node object
    node = current_process()

    # get logger
    logger = node.get_logger()

    logger.info(f"Starting node.")

    def outputs(node, logger):
        for node_name in node.out_pipes.keys():
            logger.info(f"Sending msg: Msg from node {node_name}")
            node.send_to(node_name, f"Msg from node {node_name}")

    def inputs(node, logger):
        for node_name in node.in_pipes:
            msg = node.recv_from(node_name)
            logger.info(f"Recieved msg: {msg}")

    out_msg = threading.Thread(target=outputs, args=(node, logger))
    in_msg = threading.Thread(target=inputs, args=(node, logger))

    out_msg.start()
    in_msg.start()

    out_msg.join()
    in_msg.join()

    logger.info(f"Shutting down.")

Celý příklad včetně logů naleznete zde.

Heart Beat

Dalším možným příkladem je takzvaný Heart Beat. V distribuované síti se nachází jeden řídící uzel master a několik podřízených uzlů slave.

Uzel master zašle všem slave uzlům pokyn k zahájení práce. Podřízené slave uzly zahájí práci a periodicky informují uzel master, že výpočet stále běží (takzvaný Heart beat).

Jakmile nějaký slave uzel práci dokončí, rovněž o této skutečnosti informuje master uzel. Jakmile má master informaci od všech slave uzlů ukončí se.

Úkol
Naprogramujte implementaci Heart Beat v knihovně distsim. Veškeré zprávy logujte.