"""
example

reading results from possibly blocking code running in sub processes. 
"""
import py

NUM_PROCESSES = 5

channels = []
for i in range(NUM_PROCESSES):
    gw = py.execnet.PopenGateway() # or use SSH or socket gateways 
    channel = gw.remote_exec("""
        import time
        secs = channel.receive()
        time.sleep(secs)
        channel.send("waited %d secs" % secs)
    """)
    channels.append(channel)
    print "*** instantiated subprocess", gw

mc = py.execnet.MultiChannel(channels)
queue = mc.make_receive_queue()

print "***", "verifying that timeout on receiving results from blocked subprocesses works"
try:
    queue.get(timeout=1.0) 
except Exception:
    pass

print "*** sending subprocesses some data to have them unblock"
mc.send_each(1) 

print "*** receiving results asynchronously"
for i in range(NUM_PROCESSES):
    channel, result = queue.get(timeout=2.0)
    print "result", channel.gateway, result