Open
Description
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)