-
Couldn't load subscription status.
- Fork 9
Open
Labels
help wantedExtra attention is neededExtra attention is needed
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)
Metadata
Metadata
Assignees
Labels
help wantedExtra attention is neededExtra attention is needed