I just found a bug. The current implementation only supports a strict one-receive-one-send mode within a single loop. If this pattern is violated, such as multiple receives and one send, one receive and multiple sends, or sending before receiving within a single loop, it will result in a deadlock.
async def callback(ctx: CallbackPipeContextType[str]) -> None:
with ctx as (sender, receiver):
# multiple receives and one send, dead lock!
await receiver.receive()
await receiver.receive()
await sender.send("foo")
async def callback(ctx: CallbackPipeContextType[str]) -> None:
with ctx as (sender, receiver):
# one receive and multiple sends, dead lock!
async for message in receiver:
await sender.send("foo")
await sender.send("bar")
async def callback(ctx: CallbackPipeContextType[str]) -> None:
with ctx as (sender, receiver):
# sending before receiving, dead lock!
await sender.send("foo")
async for message in receiver:
await sender.send(message)
Unfortunately, we can't resolve this issue until the underlying logic is rewritten using anyio and memory-object-streams.
There is already a PR for anyio: #34. However, this PR still has many issues, and I currently don't have time to merge it.
Originally posted by @WSH032 in #41 (comment)
I just found a bug. The current implementation only supports a strict
one-receive-one-sendmode within a single loop. If this pattern is violated, such asmultiple receives and one send,one receive and multiple sends, orsending before receivingwithin a single loop, it will result in a deadlock.Unfortunately, we can't resolve this issue until the underlying logic is rewritten using
anyioandmemory-object-streams.There is already a PR for
anyio: #34. However, this PR still has many issues, and I currently don't have time to merge it.Originally posted by @WSH032 in #41 (comment)