Paste: Test

Author: Test
Mode: python
Date: Fri, 12 Apr 2013 09:15:27
Plain Text |
#! /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)

New Annotation

Summary:
Author:
Mode:
Body: