Python — это многофункциональный язык, поддерживающий как новейшие, так и традиционные концепции программирования. Использование каналов относится к концепции межпроцессного взаимодействия, при которой два или более процесса обмениваются данными или информацией друг с другом. Это происходит только тогда, когда два или более процесса выполняются одновременно, что отражает функциональность параллельной обработки. Чтобы узнать, почему вам следует использовать каналы Python и понять, как они реализованы на этом языке программирования, вам необходимо внимательно прочитать эту статью.
Что такое pipe в Python?
Процесс, который передает эту информацию, записывает в канал, тогда как процесс, который получает эту информацию, читает из канала. Как и другие языки программирования, Python также поддерживает реализацию каналов.
Почему я должен использовать pipe в Python?
Все мы знаем, что межпроцессное взаимодействие — очень важная концепция программирования. С момента появления концепции параллельной обработки функциональные возможности и мощность компьютеров значительно расширились. Эта концепция позволила нам запускать несколько процессов одновременно, которые могут работать независимо. Однако иногда нам нужно, чтобы один процесс передавал некоторую информацию другому, которая требует дальнейшей обработки. Вот где пригодятся каналы в Python.
Канал в Python можно легко использовать для передачи информации от одного конца к другому. Это позволяет двум процессам очень удобно обмениваться данными друг с другом. Единственное, о чем необходимо позаботиться при реализации конвейеров на Python или, если на то пошло, на любом другом языке программирования, — это то, что после того, как процесс записывает в конвейер, дескриптор файла чтения должен быть заблокирован. Точно так же, когда процесс читает из канала, дескриптор файла записи должен быть заблокирован. Это делается для обеспечения целостности данных и синхронизации данных между процессами чтения и записи.
Чтобы пролить свет на реализацию каналов в Python, вам следует просмотреть следующий пример, который мы сформулировали для вас, чтобы вы могли эффективно изучить использование каналов в Python.
Примечание. Spyder IDE можно использовать для реализации программы на Python с помощью Windows 10 или любого дистрибутива Linux; однако функция «os.fork ()», которая используется в следующем примере, поддерживается только Linux. Следовательно, вы не сможете реализовать следующий код в Windows 10.
Пример использования pipe в Python
Чтобы изобразить использование канала в Python, мы хотели реализовать код, способный обеспечить связь между родительским процессом и дочерним процессом, используя канал. Чтобы облегчить такое общение, вам нужно взглянуть на следующий код:
В этом коде Python для реализации конвейера мы сначала импортировали модуль «os» Python, который облегчит эту реализацию. Затем мы создали канал с функцией «os.pipe ()» и назначили его двум файловым дескрипторам «r» и «w» для чтения и записи данных соответственно. После этого мы хотели создать дочерний процесс с идентификатором процесса, то есть pid, что можно сделать с помощью функции «os.fork ()». Затем у нас есть оператор «if», который работает с PID больше, чем «0», то есть, если PID является идентификатором родительского процесса, только тогда будет выполнен этот блок «if». В этом блоке «если» родительский процесс сначала блокирует «прочитанный» файловый дескриптор, т. Е. R, так что родительский процесс может легко писать в конвейер без каких-либо прерываний. Это делается с помощью функции «os.close ®».
После этого мы хотели уведомить пользователя через консоль о том, что родительский процесс теперь пишет в канал, для которого мы отобразили сообщение, с помощью команды «print». Затем у нас есть «текстовая» переменная, которой мы присвоили текст, который родительский процесс хочет записать в конвейер.
После этого мы вызвали функцию «os.write ()». Эта функция принимает два аргумента, то есть дескриптор файла записи и текст, который должен быть записан в конвейер. Когда эта функция вызывается, текст автоматически записывается в канал. После этого мы хотели отобразить текст, записанный в конвейер, на нашей консоли, что мы и сделаем с помощью функции «print», декодируя текстовую переменную.
Затем есть инструкция «else», которая будет работать, если PID не больше «0», т. Е. PID — это идентификатор дочернего процесса; только тогда будет выполнен этот блок «else». В этом блоке «else» дочерний процесс сначала блокирует дескриптор файла «запись», то есть w, чтобы легко прочитать текст, записанный в конвейер, без каких-либо изменений. Это делается с помощью функции «os.close (w)».
После этого мы хотели уведомить пользователя через консоль о том, что дочерний процесс теперь читает из канала, для которого мы отобразили сообщение, с помощью команды «print». Затем мы присвоили значение дескриптора открытого файла чтения «r» нашему первоначально объявленному дескриптору файла чтения. Наконец, мы хотели отобразить текст, прочитанный из канала нашим дочерним процессом, на нашей консоли с помощью функции «print». После написания этого кода Python в IDE Spyder мы просто сохранили его, а затем выполнили.
После того, как этот код был выполнен, его результат оказался несколько показанным на изображении ниже:
В этих выходных данных вы можете видеть, что первое сообщение, появившееся на консоли, было «Родительский процесс пишет:», что означает, что в настоящее время дескриптор файла чтения заблокирован, поскольку родительский процесс записывает в канал. Второе сообщение, появившееся на консоли, было «Письменный текст: добро пожаловать, дитя мое!» который представляет текст, записанный в конвейер родительским процессом. Затем третье сообщение, которое было отображено в выходных данных, было «Дочерний процесс читает:», что означает, что дескриптор файла записи заблокирован в настоящее время, поскольку дочерний процесс читает из канала. Наконец, четвертое сообщение, которое было отображено на консоли, было «Прочтите текст: добро пожаловать, мой ребенок!» который просто представляет текст, который был прочитан из канала дочерним процессом.
Таким образом, вы можете работать с конвейерами в Python и создавать еще более сложные примеры, в которых вы можете изобразить полноценную связь между родительским и дочерним процессами.
Заключение
Мы кратко говорили о каналах в Python в начале этой статьи. Затем мы пошли немного дальше, объяснив, как они работают и почему мы должны их использовать. После этого мы объяснили, как конвейеры могут быть реализованы в Python, с помощью полезного примера, в котором один процесс передает некоторую информацию другому. Изучив этот пример, вы быстро поймете, как конвейеры реализованы в Python, и тогда вы сможете реализовать более сложные программы, в которых два процесса взаимодействуют друг с другом.