Поддерживает ли многопроцессорность именованные каналы (FIFO)?

Многопроцессорные каналы и очередь основаны на анонимных каналах. Предоставляет ли multiprocessing Python именованные каналы (FIFO)?


person QuantumEnergy    schedule 28.04.2018    source источник
comment
Кстати, тег pipe относится конкретно к анонимным каналам Unix, а тег fifo — к очередям и каналам в целом; тег для именованных каналов — named-pipes.   -  person abarnert    schedule 28.04.2018


Ответы (2)


В multiprocessing нет встроенной поддержки кроссплатформенной абстракции именованных каналов.

Если вас интересует только Unix или только Windows, вы, конечно, можете создать именованные каналы вручную. Для Unix mkfifo находится в стандартной библиотеке. Для Windows вы должны использовать ctypes или cffi или стороннюю библиотеку, например win32api, для вызова CreateFile с правильными аргументами.

Попытка абстрагироваться от семантических различий между ними довольно болезненна, возможно, поэтому stdlib не пытается этого делать. (Например, именованные каналы Windows являются временными, а именованные каналы posix — постоянными.)

Вот тривиальный пример Unix:

import multiprocessing
import os

def child():
    with open('mypipe', 'rb') as p:
        print(p.read())

def main():
    try:
        os.mkfifo('mypipe')
    except FileExistsError:
        pass
    multiprocessing.Process(target=child).start()
    with open('mypipe', 'wb') as p:
        p.write(b'hi')
    os.remove('mypipe')

if __name__ == '__main__':
    main()
person abarnert    schedule 28.04.2018
comment
multiprocessing.connection.Listener поддерживает именованные каналы Windows - person QuantumEnergy; 29.04.2018
comment
@QuantumEnergy AFAIK, он использует именованные каналы Windows (и сокеты UNIX в Unix), чтобы обеспечить гораздо более простую абстракцию, чем общие именованные каналы. Я ошибаюсь? Можете ли вы на самом деле получить доступ к каким-либо функциям именованных каналов с помощью Listener? Потому что если так, то это было бы очень круто. - person abarnert; 29.04.2018
comment
@abarnert Вы правы. У меня есть еще один вопрос. Поддерживает ли multiprocessing.sharedctypes независимые процессы? Я думаю, что это поддерживает только процесс отца и ребенка или братское общение процесса. - person QuantumEnergy; 29.04.2018
comment
@QuantumEnergy Это все еще может предоставить все, что вы действительно ищете в конкретном случае использования, поэтому об этом определенно стоит упомянуть. Но поскольку вы уже написали хороший ответ на этот вопрос, я просто проголосую за ваш, а не отредактирую свой. Что касается sharedctypes, то он предназначен только для дерева процессов, созданного специально multiprocessing, но вы можете либо слегка злоупотреблять им, либо разветвлять код (обратите внимание, что документы multiprocessing ссылаются на исходный код, и, хотя там много это, большинство довольно просто…). Но это, вероятно, отдельный вопрос (и, вероятно, хороший). - person abarnert; 29.04.2018
comment
Я создал новый вопрос. Надеюсь, кто-нибудь сделает вывод. stackoverflow.com/questions/50084557/ - person QuantumEnergy; 29.04.2018

class multiprocessing.connection.Listener([адрес[, семья[, невыполненная работа[, ключ авторизации]]]])

Оболочка для связанного сокета или именованного канала Windows, которая «прослушивает» подключения. Адрес — это адрес, который будет использоваться связанным сокетом или именованным каналом объекта прослушивателя.

person QuantumEnergy    schedule 29.04.2018