Медленная проблема веб-сервиса - PullRequest
3 голосов
/ 02 июня 2011

Я создаю веб-сервис Python на компьютере с Linux (Ubuntu):

import soaplib
import os

from soaplib.core.service import rpc, DefinitionBase, soap
from soaplib.core.model.primitive import String, Integer
from soaplib.core.server import wsgi
from soaplib.core.model.clazz import Array

def runcmd(cmd):
    fout = os.popen(cmd)
    out = fout.read()
    return out

class LinuxServices(DefinitionBase):
@soap(String, String,_returns=Array(String))
def df(self,server, user):
    L = []
    cmd = 'df -hP | grep "/"'
    output = runcmd(cmd).split('\n')
    for n in xrange(len(output)-1):
        out = output[n].split()
        L.append('%s;%s' % (out[5], out[4]))
    return L

if __name__=='__main__':
try:
    from wsgiref.simple_server import make_server
    soap_application = soaplib.core.Application([LinuxServices], 'tns')
    wsgi_application = wsgi.Application(soap_application)
    server = make_server('0.0.0.0', 7789, wsgi_application)
    server.serve_forever()
except ImportError:
    print "Error: example server code requires Python >= 2.5"

Я создал его на основе этого примера: soaplib helloworld

Затем (в Windows 7) я создал проект Silverlight, где я использую этот ws для получения статуса диска на моем linux-сервере:

Сервис в проекте Silverlight:

public class LinuxService
{
    [OperationContract]
    public List<dfItem> df()
    {
        List<dfItem> dfItems = new List<dfItem>();

        WebReference.Application app = new WebReference.Application();

        var result = app.df(new WebReference.df()/*...*/);

        foreach (var item in result.dfResult)
        {
            string[] info = item.Split(';');

            dfItem dfItem = new dfItem()
            {
                MountPoint = info[0].ToString(),
                Usage = info[1].ToString()
            };
            dfItems.Add(dfItem);
        }
        return dfItems;
    }
    //...
}

Услуга вызова на странице:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    LinuxServiceClient client = new LinuxServiceClient();

    client.dfCompleted += new EventHandler<dfCompletedEventArgs>(client_dfCompleted);

    client.dfAsync();
}

void client_dfCompleted(object sender, dfCompletedEventArgs e)
{
    DG.ItemsSource = e.Result;
    DG.Visibility = System.Windows.Visibility.Visible;
}

Моя проблема в том, что при переходе на эту страницу требуется 4-8 секунд для получения данных от ws (ws в локальной сети).

Я действительно сомневаюсь, что пропускная способность линии может создать время ожидания ...

Мой вопрос: Есть ли у вас какие-либо предложения, что я могу сделать, чтобы ускорить это?

Информация о системе:

  • UbuntuServer 11.04

  • Python: Python 2.7

  • Soaplib: soaplib 2.0.0-beta2


  • Windows: Windows 7 sp1

  • Silverlight: Silverlight 4

Ответы [ 2 ]

3 голосов
/ 09 июня 2011

Я бы рекомендовал использовать wireshark http://www.wireshark.org/ для «прослушивания» разговора, происходящего по сети, путем записи («захвата») копий сетевого трафика, который устройство может видеть.

Когда вы начинаете захват, объем данных может показаться ошеломляющим, но если вы можете заметить какие-либо фрагменты, которые выглядят как ваше сообщение SOAP (должно быть легко обнаружить), то вы можете быстро отфильтровать только этот разговор по правому краю.щелкните и выберите «Follow TCP Stream».

После этого вы можете увидеть весь диалог между написанным вами SOAP-сервисом и клиентом silverlight.

Если это всевыглядит хорошо, затем закройте всплывающее окно.В качестве дополнительного бонуса, Wireshark отфильтровывает список фрагментов по тем, которые в разговоре с отметками времени относительно того, когда они произошли.Используйте это, чтобы узнать, медленно ли реагирует клиент или сервер.

Если кажется, что нет реальной задержки, то я бы предположил, что между запросом Silverlight сделать SOAP-вызов есть значительный разрыви это фактически делает сетевой вызов.

1 голос
/ 02 июня 2011

Просто беглый тест с использованием клиента suds и soaplib hello world пример:

>>> def bench_soap(num):
...:     start = time.time()
...:     for i in range(num):
...:         hello_client.service.say_hello("Dave", 5)
...:     elapsed = time.time() - start
...:     print "Completed %s: ops in %.2f seconds : %.1f ops/sec" % (num, elapsed, num / elapsed)
...:     
...:     

>>> bench_soap(100)
Completed 100: ops in 0.40 seconds : 247.5 ops/sec

>>> bench_soap(1000)
Completed 1000: ops in 3.81 seconds : 262.5 ops/sec

Я не видел ни "лага", ни чего-либокак это с моей стороны.Soaplib, кажется быстрым и отзывчивым, так что, возможно, проблема с Silverlight?Или какая-то несовместимость между ними?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...