До настоящего момента мы запускали сервер локально и удаленно и выполняли сценарии клиентов вручную. Настоящие серверы обычно предусматривают возможность обслуживания множества клиентов, причем одновременно. Чтобы посмотреть, как наш сервер справляется с нагрузкой, запустим параллельно восемь экземпляров сценария клиента с помощью сценария, представленного в примере 12.3. Описание реализации модуля launchmodes, используемого здесь для запуска клиентов, приведено в конце главы 5; там же вы найдете альтернативные приемы на основе модулей multiprocessing и subprocess.
Пример 12.3. PP4E\Internet\Sockets\testecho.py
import sys
from PP4E.launchmodes import QuietPortableLauncher
numclients = 8 def start(cmdline): QuietPortableLauncher(cmdline, cmdline)()
# start(‘echo—server.py‘) # запустить сервер локально,
# если еще не запущен
args = ‘ ‘.join(sys.argv[1:]) # передать имя сервера,
# если он запущен удаленно for i in range(numclients):
start(‘echo-client.py %s’ % args) # запустить 8? клиентов
# для тестирования сервера
Если запустить этот сценарий без аргументов, клиенты будут общаться с сервером, выполняющимся на локальном компьютере, по порту 50007. Если передать сценарию действительное имя компьютера, будет установлено соединение с удаленным сервером. В этом эксперименте участвуют три окна консоли — для клиентов, для локального сервера и для удаленного сервера. В Windows при запуске клиентов этим сценарием их вывод отбрасывается, но он был бы аналогичен тому, что мы уже видели выше. Ниже приводится диалог из окна клиента — 8 клиентов запускаются локально и взаимодействуют с локальным и удаленным серверами:
C:\…\PP4E\Internet\Sockets> set PYTHONPATH=C:\…\dev\Examples
C:\…\PP4E\Internet\Sockets> python testecho.py
C:\…\PP4E\Internet\Sockets> python testecho.py learning-python.com
Если запускаемые клиенты соединяются с сервером, выполняющимся локально (первая команда запуска клиентов), в окне локального сервера появляются сообщения о соединениях:
C:\…\PP4E\Internet\Sockets> python echo-server.py
Server connected by (‘127.0.0.1’, 57721)
Server connected by (‘127.0.0.1’, 57722)
Server connected by (‘127.0.0.1’, 57723)
Server connected by (‘127.0.0.1’, 57724)
Server connected by (‘127.0.0.1’, 57725)
Server connected by (‘127.0.0.1’, 57726)
Server connected by (‘127.0.0.1’, 57727)
Server connected by (‘127.0.0.1’, 57728)
Если сервер выполняется удаленно, сообщения о соединениях клиентов появляются в окне, которое отображает SSH (или другое) соединение с удаленным компьютером, в данном случае — с learning—python.com:
[…]$ python echo-server.py
Server connected by (‘72.236.109.185’, 57729)
Server connected by (‘72.236.109.185’, 57730)
Server connected by (‘72.236.109.185’, 57731)
Server connected by (‘72.236.109.185’, 57732)
Server connected by (‘72.236.109.185’, 57733)
Server connected by (‘72.236.109.185’, 57734)
Server connected by (‘72.236.109.185’, 57735)
Server connected by (‘72.236.109.185’, 57736)
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011