Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'add_mutex_python_bindings' into 'master'
[simgrid.git] / examples / python / synchro-mutex / synchro-mutex.py
1 from argparse import ArgumentParser
2 from dataclasses import dataclass
3 import sys
4
5 from simgrid import Actor, Engine, Host, Mutex, this_actor
6
7
8 def create_parser() -> ArgumentParser:
9     parser = ArgumentParser()
10     parser.add_argument(
11         '--platform',
12         type=str,
13         required=True,
14         help='path to the platform description'
15     )
16     parser.add_argument(
17         '--actors',
18         type=int,
19         default=6,
20         help='how many pairs of actors should be started'
21     )
22     return parser
23
24
25 @dataclass
26 class ResultHolder:
27     value: int
28
29
30 def worker_context_manager(mutex: Mutex, result: ResultHolder):
31     with mutex:
32         this_actor.info(f"Hello simgrid, I'm ready to compute after acquiring the mutex from a context manager")
33         result.value += 1
34     this_actor.info(f"I'm done, good bye")
35
36
37 def worker(mutex: Mutex, result: ResultHolder):
38     mutex.lock()
39     this_actor.info("Hello simgrid, I'm ready to compute after a regular lock")
40     result.value += 1
41     mutex.unlock()
42     this_actor.info("I'm done, good bye")
43
44
45 def master(settings):
46     results = [ResultHolder(value=0) for _ in range(settings.actors)]
47     for i in range(settings.actors):
48         mutex = Mutex()
49         Actor.create(f"worker-{i}(mgr)", Host.by_name("Jupiter"), worker_context_manager, mutex, results[i])
50         Actor.create(f"worker-{i}", Host.by_name("Tremblay"), worker, mutex, results[i])
51     this_actor.sleep_for(10)
52     for i in range(settings.actors):
53         this_actor.info(f"Result[{i}] -> {results[i].value}")
54     this_actor.info("I'm done, good bye")
55
56
57 def main():
58     settings = create_parser().parse_known_args()[0]
59     e = Engine(sys.argv)
60     e.load_platform(settings.platform)
61     Actor.create("master", Host.by_name("Tremblay"), master, settings)
62     e.run()
63
64
65 if __name__ == "__main__":
66     main()