Сокеты и независимые программы

sokety i nezavisimye programmy Системные инструменты параллельного выполнения

Потоки выполнения могут использовать сокеты для взаимодействий между собой, однако модель потоков с общей памятью часто позволяет использовать более простые механизмы, такие как глобальные переменные и объекты и очереди. Наиболее ярко сокеты проявляют себя, когда они используются для организации взаимодействий отдельных процессов и программ, запускаемых независимо друг от друга. В примере 5.26 повторно используются функции server и client из предыдущего примера, но теперь они вызываются процессами и потоками из программ, запускаемых независимо друг от друга.

Пример 5.26. PP4E\System\Processes\socket-preview-progs.py

тоже сокет, но теперь для общения независимых программ, а не только потоков выполнения; сервер в этом примере обслуживает клиентов, выполняющихся в виде отдельных процессов и потоков; сокеты, как и именованные каналы, являются глобальными для компьютера: для их использования не требуется совместно используемая память from socket_preview import server, client # оба используют тот же номер порта import sys, os

from threading import Thread

mode = int(sys.argv[1])

if mode == 1: # запустить сервер в этом процессе

server()

elif mode == 2: # запустить клиента в этом процессе

client(‘client:process=%s’ % os.getpid())

else: # запустить 5 потоков-клиентов

for i in range(5):

Thread(target=client, args=(‘client:thread=%s’ % i,)).start()

Запустим этот сценарий в Windows (переносимость — важное преимущество сокетов). Сначала запустим в отдельном окне сервер, как независимую программу, — этот процесс будет выполняться без остановки, ожидая от клиентов запросов на соединение (как и в предыдущем примере с каналами, вам может потребоваться воспользоваться Диспетчером задач (Task Manager) или закрыть окно, чтобы прервать работу сервера):

C:\\PP4E\System\Processes> socket-preview-progs.py 1

Теперь, в другом окне, запустим несколько клиентов, выполняющихся в виде процессов и потоков, как независимые программы; если передать сценарию аргумент 2 в командной строке, он запустит один клиентский процесс, а если передать 3, он породит пять потоков выполнения, обменивающихся данными с сервером параллельно:

C:\\PP4E\System\Processes> socket-preview-progs.py 2

client got: [b”server got: [b’client:process=7384’]”]

C:\\PP4E\System\Processes> socket-preview-progs.py 2

client got: [b”server got: [b’client:process=7604’]”]

C:\\PP4E\System\Processes> socket-preview-progs.py 3

client got: [b”server got: [b’client:thread=1’]”]

client got: [b”server got: [b’client:thread=2’]”]

client got: [b”server got: [b’client:thread=0’]”]

client got: [b”server got: [b’client:thread=3’]”]

client got: [b”server got: [b’client:thread=4’]”]

C:\..\PP4E\System\Processes> socket-preview-progs.py 3

client got: [b”server got: [b’client:thread=3’]”]

client got: [b”server got: [b’client:thread=1’]”]

client got: [b”server got: [b’client:thread=2’]”]

client got: [b”server got: [b’client:thread=4’]”]

client got: [b”server got: [b’client:thread=0’]”]

C:\\PP4E\System\Processes> socket-preview-progs.py 2

client got: [b”server got: [b’client:process=6428’]”]

Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011

Оцените статью
Секреты программирования
Добавить комментарий