Многопоточность позволяет одновременно выполнять несколько различных действий в различных потоках. Применение многопточности в серверном приложении позволяет обрабатывать одновременно несколько клиентов. Рассмотрим, как создать многпоточное клиент-серверное приложение.
В Python многопоточность обеспечивается функциональностью модулей _thread
и threading
. В частности, для запуска нового потока мы можем использовать
функцию start_new_thread() из модуля _thread
, которая имеет следующее определение:
_thread.start_new_thread(function, args[, kwargs])
Эта функция запускает поток, который выполняет функцию из первого параметра function
, передавая ей в качестве аргументов кортеж args
. Опционально
можно передать словарь дополнительных параметров через третий параметр kwargs
Например, определим в файле server.py следующий код сервера
import socket from _thread import * # функция для обработки каждого клиента def client_thread (con): data = con.recv(1024) # получаем данные от клиента message = data.decode() # преобразуем байты в строку print(f"Client sent: {message}") message = message[::-1] # инвертируем строку con.send(message.encode()) # отправляем сообщение клиенту con.close() # закрываем подключение server = socket.socket() # создаем объект сокета сервера hostname = socket.gethostname() # получаем имя хоста локальной машины port = 12345 # устанавливаем порт сервера server.bind((hostname, port)) # привязываем сокет сервера к хосту и порту server.listen(5) # начинаем прослушиваение входящих подключений print("Server running") while True: client, _ = server.accept() # принимаем клиента start_new_thread(client_thread, (client, )) # запускаем поток клиента
Здесь при подключении каждого нового подключения функция start_new_thread()
запускает для его обработки функцию client_thread()
и передает ей
текущего клиента, который хранится в переменной client. В функции client_thread()
для примера получаем от клиента строку, инвертируем ее и отправляем обратно клиенту.
Для тестирования сервера определим следующий код клиента:
import socket client = socket.socket() # создаем сокет клиента hostname = socket.gethostname() # получаем хост локальной машины port = 12345 # устанавливаем порт сервера client.connect((hostname, port)) # подключаемся к серверу message = input("Input a text: ") # вводим сообщение client.send(message.encode()) # отправляем сообщение серверу data = client.recv(1024) # получаем данные с сервера print("Server sent: ", data.decode()) client.close() # закрываем подключение
Клиент ожидает ввод с консоли строки, которая отправляется серверу. Ответ сервера выводится на консоль.
Запустим сервер, затем запустим клиент. Пример работы. Сервер:
c:\python>python server.py Server running Client sent: hello
Клиент:
c:\python>python client.py Input a text: hello Server sent: olleh c:\python>