Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
c2139a8cb84e0b59dac033da90460fc5a8ab9c8f
[simgrid.git] / examples / python / activityset-waitany / activityset-waitany.py
1 # Copyright (c) 2017-2023. The SimGrid Team. All rights reserved.
2 #
3 # This program is free software you can redistribute it and/or modify it
4 # under the terms of the license (GNU LGPL) which comes with this package.
5
6 """
7 Usage: activityset-waitany.py platform_file [other parameters]
8 """
9
10 import sys
11 from simgrid import Actor, ActivitySet, Engine, Comm, Exec, Io, Host, Mailbox, this_actor
12
13 def bob():
14   mbox = Mailbox.by_name("mbox")
15   disk = Host.current().get_disks()[0]
16
17   this_actor.info("Create my asynchronous activities")
18   exec = this_actor.exec_async(5e9)
19   comm, payload = mbox.get_async()
20   io   = disk.read_async(300000000)
21
22   pending_activities = ActivitySet([exec, comm])
23   pending_activities.push(io) # Activities can be pushed after creation, too
24  
25   this_actor.info("Wait for asynchronous activities to complete")
26   while not pending_activities.empty():
27     completed_one = pending_activities.wait_any()
28
29     if isinstance(completed_one, Comm):
30       this_actor.info("Completed a Comm")
31     elif isinstance(completed_one, Exec):
32       this_actor.info("Completed an Exec")
33     elif isinstance(completed_one, Io):
34       this_actor.info("Completed an I/O")
35
36   this_actor.info("Last activity is complete")
37
38 def alice():
39   this_actor.info("Send 'Message'")
40   Mailbox.by_name("mbox").put("Message", 600000000)
41
42 if __name__ == '__main__':
43   e = Engine(sys.argv)
44   e.set_log_control("root.fmt:[%4.6r]%e[%5a]%e%m%n")
45
46   # Load the platform description
47   e.load_platform(sys.argv[1])
48
49   Actor.create("bob",   Host.by_name("bob"), bob)
50   Actor.create("alice", Host.by_name("alice"), alice)
51
52   e.run()
53
54 """
55
56 /* Copyright (c) 2010-2023. The SimGrid Team. All rights reserved.          */
57
58 /* This program is free software; you can redistribute it and/or modify it
59  * under the terms of the license (GNU LGPL) which comes with this package. */
60
61 #include "simgrid/s4u.hpp"
62 #include <cstdlib>
63 #include <iostream>
64 #include <string>
65 namespace sg4 = simgrid::s4u;
66
67 XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_activity_waittany, "Messages specific for this s4u example");
68
69 static void bob()
70 {
71   sg4::Mailbox* mbox    = sg4::Mailbox::by_name("mbox");
72   const sg4::Disk* disk = sg4::Host::current()->get_disks().front();
73   std::string* payload;
74
75   XBT_INFO("Create my asynchronous activities");
76   auto exec = sg4::this_actor::exec_async(5e9);
77   auto comm = mbox->get_async(&payload);
78   auto io   = disk->read_async(3e8);
79
80   sg4::ActivitySet pending_activities({boost::dynamic_pointer_cast<sg4::Activity>(exec),
81                                        boost::dynamic_pointer_cast<sg4::Activity>(comm),
82                                        boost::dynamic_pointer_cast<sg4::Activity>(io)});
83
84   XBT_INFO("Wait for asynchronous activities to complete");
85   while (not pending_activities.empty()) {
86     auto completed_one = pending_activities.wait_any();
87     if (completed_one != nullptr) {
88       if (boost::dynamic_pointer_cast<sg4::Comm>(completed_one))
89         XBT_INFO("Completed a Comm");
90       if (boost::dynamic_pointer_cast<sg4::Exec>(completed_one))
91         XBT_INFO("Completed an Exec");
92       if (boost::dynamic_pointer_cast<sg4::Io>(completed_one))
93         XBT_INFO("Completed an I/O");
94     }
95   }
96   XBT_INFO("Last activity is complete");
97   delete payload;
98 }
99
100 static void alice()
101 {
102   auto* payload = new std::string("Message");
103   XBT_INFO("Send '%s'", payload->c_str());
104   sg4::Mailbox::by_name("mbox")->put(payload, 6e8);
105 }
106
107 int main(int argc, char* argv[])
108 {
109   sg4::Engine e(&argc, argv);
110
111   e.load_platform(argv[1]);
112
113   sg4::Actor::create("bob", e.host_by_name("bob"), bob);
114   sg4::Actor::create("alice", e.host_by_name("alice"), alice);
115
116   e.run();
117
118   return 0;
119 }
120 """