Channels are streamed connections or pipes between a pair of chares. They simplify the expression of sends/receives from inside a coroutine without having to exit the coroutine.
To create a Channel:
Establish a channel between chare and remote, returning a channel object.
Note that chare is an actual chare object, not a proxy. remote is a proxy to the remote chare.
Channels do not have to be created from coroutines, but they can only be used from coroutines.
There is no restriction on the number of channels that a chare can establish, and it can establish multiple channels with the same remote.
Channel objects have the following methods:
Send the arguments through the channel to the remote chare.
Receives arguments (unpacked) from the channel. Messages are received in order.
from charm4py import charm, Chare, Array, coro, Channel NUM_ITER = 100 class A(Chare): def __init__(self, numchares): myidx = self.thisIndex neighbors =  neighbors.append(self.thisProxy[(myidx + 1) % numchares]) neighbors.append(self.thisProxy[(myidx - 1) % numchares]) self.channels =  for nb in neighbors: self.channels.append(Channel(self, remote=nb)) @coro def work(self): for i in range(NUM_ITER): for ch in self.channels: ch.send(x, y, z) for ch in charm.iwait(self.channels): x, y, z = ch.recv() # ... do something with data ... def main(args): numchares = charm.numPes() * 8 array = Array(A, numchares, args=[numchares]) future = array.work(awaitable=True) future.get() exit() charm.start(main)