Paste: Test
Author: | Test |
Mode: | python |
Date: | Fri, 12 Apr 2013 09:15:27 |
Plain Text |
"""
Есть некое приложение прообраз которого описан в 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)
New Annotation