Правильно ли использовать os.pipe в Windows с многопроцессорным модулем? - PullRequest
0 голосов
/ 08 октября 2019

Проблема в том, что os.pipe(), кажется, не работает в Windows, когда чтение и конец записи находятся в разных процессах.

import os
import multiprocessing as mp

def func(pin):
    print('func.pin:', pin)
    b = os.read(pin, 4096)
    print('func.1: b =', b)
    b = os.read(pin, 4096)
    print('func.2: b =', b)

if __name__ == '__main__':
    pin, pout = os.pipe()
    print('main.pin:', pin, ' pout:', pout)

    os.write(pout, b'abc123')

    #b = os.read(pin, 4096)
    #print('main.1: b =', b)  # will work as intended

    pfunc = mp.Process(target = func, args=(pin,))
    pfunc.start()
    pfunc.join()

Ожидаемый вывод (заблокированное второе чтение):

main.pin: 3  pout: 4
func.pin: 3
func.1: b = b'abc123'

Наблюдаемый вывод:

main.pin: 3  pout: 4
func.pin: 3
func.1: b = b''
func.2: b = b''

т.е. Windows не читает правильно из канала и не блокирует операцию чтения. Хотя идентификатор файла правильный.

Мои вопросы:

  1. Почему я не могу использовать канал так, как задумано (как в Linux, ожидаемый вывод)?

  2. Как изменить его, чтобы он работал?

Я знаю multiprocessing.Pipe, но я хочу использовать что-то более простое (потенциально более быстрое), например os.pipe, потому что все, что мне нужно, это просто канал потока байтов.

Я провел поиск и обнаружил следующее: os.pipe создает наследуемые FD с плохим внутренним состоянием в Windows , Передача каналов в подпроцессы в Python в Windows . Я не могу полностью понять их, мне кажется, что os.pipe не очень хорошо поддерживается в этих обстоятельствах, особенно подпроцесс не может легко получить доступ к трубе (или даже не может?).

Справочная информация: я учусьнекоторое сетевое программирование на Python и написание программы, которая разделяет потоковую передачу по сети и обработку данных в разных процессах с помощью многопроцессорного модуля.

...