Проблема в том, что 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 не читает правильно из канала и не блокирует операцию чтения. Хотя идентификатор файла правильный.
Мои вопросы:
Почему я не могу использовать канал так, как задумано (как в Linux, ожидаемый вывод)?
Как изменить его, чтобы он работал?
Я знаю multiprocessing.Pipe
, но я хочу использовать что-то более простое (потенциально более быстрое), например os.pipe
, потому что все, что мне нужно, это просто канал потока байтов.
Я провел поиск и обнаружил следующее: os.pipe создает наследуемые FD с плохим внутренним состоянием в Windows , Передача каналов в подпроцессы в Python в Windows . Я не могу полностью понять их, мне кажется, что os.pipe
не очень хорошо поддерживается в этих обстоятельствах, особенно подпроцесс не может легко получить доступ к трубе (или даже не может?).
Справочная информация: я учусьнекоторое сетевое программирование на Python и написание программы, которая разделяет потоковую передачу по сети и обработку данных в разных процессах с помощью многопроцессорного модуля.