Python 3.5 зависает на await asyncio.writer.drain () и буфер никогда не уменьшается - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть сервер, который также взаимодействует с самим собой, поскольку он был клиентом (он создает соединение с самим собой с помощью asyncio.open_connection (), имеющего программу записи и чтения asyncio).Протокол связи - JSON-RPC.

Как только размер буфера asyncio writer превысит верхний порог, и я ожидаю истощения, в программе Python3.5 с несколькими сопрограммами она, кажется, навсегда зависает.Размер буфера никогда не меняется, даже если цикл обработки событий имеет шанс передать управление любой сопрограмме, которая может очистить буфер пишущего устройства.У меня возникли проблемы с утечкой, которые не являются сопрограммированными, и я прочитал о них, я использую asyncio.lock вокруг него, но я не думаю, что это вызывает взаимоблокировку, потому что команда внутри блокировки не должна зависеть от этой строки в другихсопрограммы.

with await self._drain_lock:
   await self.writer.drain()
  1. Мне кажется, что внутренний буфер уменьшается только в методе _write_ready () _UnixWritePipeTransport (unix_events.py), _SelectorSslTransport и _SelectorSocketTransport (selector_events),Они добавляются как обратные вызовы в конце write (), если буфер пуст.Когда эти обратные вызовы должны быть выполнены?

  2. Возможно ли, что он заблокирован, потому что, когда сервер связывается с самим собой, опустошение буфера зависит от показаний?

...