text: # Wire up a ping/pong counting loop between 2 subprocesses.
  
  from __future__ import print_function
  import mitogen.core
  import mitogen.select
  
  
  @mitogen.core.takes_router
  def ping_pong(control_sender, router):
      with mitogen.core.Receiver(router) as recv:
          # Tell caller how to communicate with us.
          control_sender.send(recv.to_sender())
  
          # Wait for caller to tell us how to talk back:
          data_sender = recv.get().unpickle()
  
          n = 0
          while (n + 1) < 30:
              n = recv.get().unpickle()
              print('the number is currently', n)
              data_sender.send(n + 1)
  
  
  @mitogen.main()
  def main(router):
      # Create a receiver for control messages.
      with mitogen.core.Receiver(router) as recv:
          # Start ping_pong() in child 1 and fetch its sender.
          c1 = router.local()
          c1_call = c1.call_async(ping_pong, recv.to_sender())
          c1_sender = recv.get().unpickle()
  
          # Start ping_pong() in child 2 and fetch its sender.
          c2 = router.local()
          c2_call = c2.call_async(ping_pong, recv.to_sender())
          c2_sender = recv.get().unpickle()
  
          # Tell the children about each others' senders.
          c1_sender.send(c2_sender)
          c2_sender.send(c1_sender)
  
      # Start the loop.
      c1_sender.send(0)
  
      # Wait for both functions to return.
      mitogen.select.Select.all([c1_call, c2_call])
  