Python os.pipe vs multiprocessing.Pipe

Недавно я изучал инструменты параллельного программирования в Python. И вот два основных различия между os.pipe и multiprocessing.Pipe. (Несмотря на то, что они используются)

  • os.pipe однонаправленная, многопроцессорная. Протокол двунаправленный;
  • При переносе вещей в трубку/прием данных из трубы os.pipe использует кодирование/декодирование, а многопроцессорная обработка. В приложении используется pickle/unpickle

Я хочу знать, правильно ли я понимаю, и есть ли другая разница? Спасибо.

Ответ 1

Я считаю, что все, что вы сказали, верно.

В Linux os.pipe - это просто интерфейс Python для доступа к традиционным POSIX-каналам. В Windows это реализовано с помощью CreatePipe. Когда вы это называете, вы возвращаете два обычных дескриптора файла. Он однонаправлен, и вы просто пишете байты на одном конце, которые буферизуются ядром, пока кто-то не читает с другой стороны. Это довольно низкий уровень, по крайней мере, по стандартам Python.

multiprocessing.Pipe объекты - это гораздо более высокоуровневый интерфейс, реализованный с использованием объектов multiprocessing.Connection. В Linux они фактически построены поверх сокетов POSIX, а не POSIX. В Windows они построены с использованием API CreateNamedPipe. Как вы отметили, объекты multiprocessing.Connection могут отправлять/получать любой соблазнительный объект и автоматически обрабатывать процесс травления/распиловки, а не просто обрабатывать байты. Они способны быть двунаправленными и однонаправленными.