Потоки выполнения могут использовать сокеты для взаимодействий между собой, однако модель потоков с общей памятью часто позволяет использовать более простые механизмы, такие как глобальные переменные и объекты и очереди. Наиболее ярко сокеты проявляют себя, когда они используются для организации взаимодействий отдельных процессов и программ, запускаемых независимо друг от друга. В примере 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