Asynchronous multiprocessing.Pipe reads throw when using uvloop
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 35/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Đình trệ
- Công nghệ
- python
- Lĩnh vực
- backend, networking
Hướng nghiên cứu
Bắt đầu bằng cách chạy bản tái hiện được cung cấp với Python 3.13.5 và uvloop, rồi so sánh hành vi của nó với event loop của asyncio, tập trung vào add_reader(), multiprocessing.Pipe, poll() và recv_bytes(). Được xem là hoàn tất khi các thao tác đọc Pipe bất đồng bộ không còn phát sinh BlockingIOError dưới uvloop, đồng thời vẫn giữ nguyên hành vi đọc đã được minh họa.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Summary
When using an asyncio.Event() with loop.add_reader() to asynchronously read from a multiprocessing.Pipe, the call to recv_bytes() throws:
Process reader:
Traceback (most recent call last):
File "/home/james/.pyenv/versions/3.13.5/lib/python3.13/multiprocessing/process.py", line 313, in _bootstrap
self.run()
~~~~~~~~^^
File "/home/james/.pyenv/versions/3.13.5/lib/python3.13/multiprocessing/process.py", line 108, in run
self._target(*self._args, **self._kwargs)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/james/code/connection_test.py", line 25, in reader_wrapper
uvloop.run(async_reader(read_pipe))
~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/james/code/.venv/lib/python3.13/site-packages/uvloop/__init__.py", line 109, in run
return __asyncio.run(
~~~~~~~~~~~~~^
wrapper(),
^^^^^^^^^^
...<2 lines>...
**run_kwargs
^^^^^^^^^^^^
)
^
File "/home/james/.pyenv/versions/3.13.5/lib/python3.13/asyncio/runners.py", line 195, in run
return runner.run(main)
~~~~~~~~~~^^^^^^
File "/home/james/.pyenv/versions/3.13.5/lib/python3.13/asyncio/runners.py", line 118, in run
return self._loop.run_until_complete(task)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
File "uvloop/loop.pyx", line 1518, in uvloop.loop.Loop.run_until_complete
File "/home/james/code/.venv/lib/python3.13/site-packages/uvloop/__init__.py", line 61, in wrapper
return await main
^^^^^^^^^^
File "/home/james/code/connection_test.py", line 20, in async_reader
message = read_pipe.recv_bytes()
File "/home/james/.pyenv/versions/3.13.5/lib/python3.13/multiprocessing/connection.py", line 216, in recv_bytes
buf = self._recv_bytes(maxlength)
File "/home/james/.pyenv/versions/3.13.5/lib/python3.13/multiprocessing/connection.py", line 437, in _recv_bytes
return self._recv(size)
~~~~~~~~~~^^^^^^
File "/home/james/.pyenv/versions/3.13.5/lib/python3.13/multiprocessing/connection.py", line 395, in _recv
chunk = read(handle, remaining)
BlockingIOError: [Errno 11] Resource temporarily unavailable
This does not occur when running with asyncio
Environment
Python: 3.13.5
uvloop: 0.21.0
Reproduction
import asyncio
import uvloop
from multiprocessing import Process
from multiprocessing.connection import Connection, Pipe, wait
def writer(write_pipe: Connection):
message = b'!' * 65536
while True:
write_pipe.send_bytes(message)
async def async_reader(read_pipe: Connection):
message_available = asyncio.Event()
asyncio.get_running_loop().add_reader(
read_pipe.fileno(), message_available.set
)
while True:
await message_available.wait()
while read_pipe.poll():
message = read_pipe.recv_bytes()
print('Got message')
message_available.clear()
def reader_wrapper(read_pipe: Connection):
uvloop.run(async_reader(read_pipe))
if __name__ == '__main__':
read_pipe, write_pipe = Pipe(duplex=False)
reader_process = Process(
name="reader", target=reader_wrapper, args=(read_pipe,)
)
reader_process.start()
writer_process = Process(
name="writer", target=writer, args=(write_pipe,)
)
writer_process.start()
wait([reader_process.sentinel, writer_process.sentinel])
- Ngôn ngữ chính
- Cython
- Star
- 11.9k
- Fork
- 615
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Hướng dẫn đóng góp
Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của MagicStack/uvloop
-
License not clear Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
MagicStack/uvloop#759 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
MagicStack/uvloop#741 · 2 reaction ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
MagicStack/uvloop#702 · 8 bình luận · 9 reaction ·
-
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 68/100
MagicStack/uvloop#763 ·
-
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 68/100
MagicStack/uvloop#760 ·
Tất cả issue của MagicStack/uvloop
Issue tương tự
-
area/sessions comp/cron comp/gateway P2 sweeper:risk-message-delivery sweeper:risk-session-state type/bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
NousResearch/hermes-agent#118863 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
use-agent-os/agent-os#3312 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 85/100
-
needs-acceptance wg/data-plane-networking
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
vllm-project/semantic-router#4024 · 1 bình luận ·