Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: QuantumEnergyОтветов: 2

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

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

pythonmultiprocessingnamed-pipes

Ответы

Ответ 1 · рейтинг 3 · abarnert

В 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()

Ответ 2 · рейтинг 1 · QuantumEnergy

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы