#! /usr/bin/python # coding: utf8 """ Есть некое приложение прообраз которого описан в test_mock. Его задачи: * соединиться к серверу (def serve) * получать от сервера пакеты (def serve) * делить их по разделителю (def serve) * парсить их - это XML (def parse) * обрабатывать (def process) Появились некоторые проблемы с производительностью. В результате профилирования выяснилось, что основное время тратиться на парсинг пакетов. Большинство, если не сказать все, сервера наших клиентов имеют многоядерные процессоры. Поэтому принято решение масштабировать приложение позволяя ему использовать и другие ресурсы сервера (дополнительные ядра). (!!!) Ваша задача - вынести парсинг пакетов в отдельные потоки (пул потоков). При этом процессинг должен остаться в основном потоке и порядок сообщений НЕ должен быть нарушен. (!!!) Достаточно ли будет такой оптимизации ? Станет ли приложение более 'отзывчивым' ? Возможно стоит изменить что-то ещё ? Если да, то что ? Постарайтесь обосновать свой ответ. """ from xml.etree import ElementTree as etree import socket import time packet_separator = '\x00' def parse(data): time.sleep(.5) return etree.fromstring(data) def process(packet): xml = etree.tostring(packet) print "== RECEIVED ==" print xml def serve(host, port): sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sck.connect((host, port)) accumulated = '' while True: data = sck.recv(1024) if not data: break packets = data.split(packet_separator) packets[0] = accumulated + packets[0] packets, accumulated = packets[:-1], packets[-1] pk="" for packet in packets: pk = parse(packet) process(pk) sck.close() if __name__ == '__main__': serve('127.0.0.1', 33333)