Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
8f4f728e773cc4812cac3476c3ac24b091a9e9f7
[simgrid.git] / examples / python / comm-wait / comm-wait.py
1 # Copyright (c) 2010-2022. The SimGrid Team. All rights reserved.
2
3 #
4 # This program is free software; you can redistribute it and/or modify it
5 # under the terms of the license (GNU LGPL) which comes with this package.
6
7 from simgrid import Actor, Engine, Host, Mailbox, this_actor
8 import sys
9
10 # This example shows how to use simgrid::s4u::this_actor::wait() to wait for a given communication.
11 #
12 # As for the other asynchronous examples, the sender initiate all the messages it wants to send and
13 # pack the resulting simgrid::s4u::CommPtr objects in a vector. All messages thus occurs concurrently.
14 #
15 # The sender then loops until there is no ongoing communication.
16
17
18 def sender(messages_count, msg_size, receivers_count):
19      # List in which we store all ongoing communications
20      pending_comms = []
21
22      # Vector of the used mailboxes
23      mboxes = [Mailbox.by_name("receiver-{:d}".format(i)) for i in range(0, receivers_count)]
24
25      # Start dispatching all messages to receivers, in a round robin fashion
26      for i in range(0, messages_count):
27          content = "Message {:d}".format(i)
28          mbox = mboxes[i % receivers_count]
29
30          this_actor.info("Send '{:s}' to '{:s}'".format(content, str(mbox)))
31
32          # Create a communication representing the ongoing communication, and store it in pending_comms
33          comm = mbox.put_async(content, msg_size)
34          pending_comms.append(comm)
35
36      # Start sending messages to let the workers know that they should stop
37      for i in range(0, receivers_count):
38          mbox = mboxes[i]
39          this_actor.info("Send 'finalize' to '{:s}'".format(str(mbox)))
40          comm = mbox.put_async("finalize", 0)
41          pending_comms.append(comm)
42
43      this_actor.info("Done dispatching all messages")
44
45      # Now that all message exchanges were initiated, wait for their completion, in order of creation.
46      for comm in pending_comms:
47          comm.wait()
48      this_actor.info("Goodbye now!")
49
50 def receiver(id):
51      mbox = Mailbox.by_name("receiver-{:d}".format(id))
52      this_actor.info("Wait for my first message")
53      while True:
54          received = mbox.get()
55          this_actor.info("I got a '{:s}'.".format(received))
56          if received == "finalize":
57              break  # If it's a finalize message, we're done.
58
59
60 if __name__ == '__main__':
61     e = Engine(sys.argv)
62
63     e.load_platform(sys.argv[1])             # Load the platform description
64
65     Actor.create("sender", Host.by_name("Tremblay"), sender, 3, 50000000, 1)
66     Actor.create("receiver", Host.by_name("Ruby"), receiver, 0)
67   
68     e.run()