Simulátor distribuované sítě

Užitečné odkazy

Distsim

Jednoduchá Python knihovna pro simulaci distribuované sítě za pomoci procesů.

Instalace knihovny

Zatím není dostupná na pip, proto je nutná ruční instalace:

1
2
3
$ git clone https://github.com/mikulatomas/distsim
$ cd distsim
$ pip install -e .

Použití knihovny distsim

Knihovna obsahuje třídy Network a Node. Uživatelsky nás zajímá zejména třída Network.

Třídě Network předáme topologii a cestu kde mají být uloženy logy. Níže vidíme příklad jednoduché sítě s dvěma uzly. Uzel node1 a node2 vykonávájí funkci node_code a nepřímá žádné argumenty. Z uzlu node1 vede jednosměrný kanál do uzlu node2. Podobně je tomu rovněž opačným směrem. V topologii sítě tedy musíme zadefinovat názvy uzlů, jejich odchozí kanály, funkce které mají vykonávat a jejich argumenty.

1
2
3
4
5
6
7
8
9
10
NETWORK_ARCHITECTURE = {
    'node1': {
        'out': {'node2', },
        'function': node_code,
        'args': ()},
    'node2': {
        'out': {'node1', },
        'function': node_code,
        'args': ()},
}

Funkce node_code může vypadat následovně:

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.")

Jako poslední krok stačí síť vytvořit a spustit:

1
2
3
4
5
6
7
# run network
if __name__ == "__main__":
    network = Network(NETWORK_ARCHITECTURE,
                      log_dir=pathlib.Path(__file__).parent.absolute())

    network.start()
    network.join()

Ostatní příklady

Pokročilejší funkcionalita knihovny je demonstrována v příkladech zde.

Úkol
Nainstalujte a otestujte funkčnost knihovny. Použít můžete dostupné příklady.

Úkol
Vytvořte úplnou topologii (každý uzel má spojení s každým). V této topologii každý uzel odešle zprávu všem ostatním a počká na zprávy příchozí. Vše zalogujte.