Тайм-аут набора для xmlrpclib. ServerProxy

Используйте <meta charset="utf-8" /> для веб-браузеров при использовании HTML5.

Используйте <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> при использовании HTML4 или XHTML или для устаревших парсеров dom, например DOMDocument в php

20
задан ashchristopher 16 December 2008 в 19:22
поделиться

5 ответов

Я посмотрел на несколько способов решить эту проблему, и безусловно самое изящное описано здесь: https://seattle.cs.washington.edu/browser/seattle/trunk/demokit/timeout_xmlrpclib.py? rev=692

техника была первоначально представлена здесь, но эта ссылка является битой: http://blog.bjola.ca/2007/08/using-timeout-with-xmlrpclib.html

Это работает с Python 2.5 и 2.6. Новая ссылка утверждает, что работала с Python 3.0 также.

5
ответ дан 29 November 2019 в 20:09
поделиться

Вот дословная копия от http://code.activestate.com/recipes/473878/

def timeout(func, args=(), kwargs={}, timeout_duration=1, default=None):
    import threading
    class InterruptableThread(threading.Thread):
        def __init__(self):
        threading.Thread.__init__(self)
        self.result = None

        def run(self):
            try:
                self.result = func(*args, **kwargs)
            except:
                self.result = default

    it = InterruptableThread()
    it.start()
    it.join(timeout_duration)
    if it.isAlive():
        return default
    else:
        return it.result
1
ответ дан 29 November 2019 в 20:09
поделиться

Более простое решение находится по адресу: http://www.devpicayune.com/entry/200609191448

import xmlrpclib 
import socket

x = xmlrpclib.ServerProxy('http:1.2.3.4')  
socket.setdefaulttimeout(10)        #set the timeout to 10 seconds 
x.func_name(args)                   #times out after 10 seconds
socket.setdefaulttimeout(None)      #sets the default back
19
ответ дан 29 November 2019 в 20:09
поделиться

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

Может быть, какой-то пример будет лучшим объяснением. Допустим, у нас есть таблица членов . Каждый участник имеет идентификатор и имя пользователя. Необязательно, у него может быть адрес электронной почты (но он не обязан). Кроме того, каждый член имеет столбец postCount (который увеличивается при каждой записи сообщения пользователем). Таким образом, столбец электронной почты может иметь значение null (поскольку электронная почта является необязательной), в то время как столбец postCount имеет значение NOT NULL , но имеет значение по умолчанию 0 (поскольку при создании нового члена у него нет записей).

-121--1840460-

Используйте List < T > .Sort () и убедитесь, что у вас есть соответствующий компаратор.

-121--3274172-

чистая неглобальная версия.

import xmlrpclib
import httplib


class TimeoutHTTPConnection(httplib.HTTPConnection):
    def connect(self):
        httplib.HTTPConnection.connect(self)
        self.sock.settimeout(self.timeout)


class TimeoutHTTP(httplib.HTTP):
    _connection_class = TimeoutHTTPConnection

    def set_timeout(self, timeout):
        self._conn.timeout = timeout


class TimeoutTransport(xmlrpclib.Transport):
    def __init__(self, timeout=10, *l, **kw):
        xmlrpclib.Transport.__init__(self, *l, **kw)
        self.timeout = timeout

    def make_connection(self, host):
        conn = TimeoutHTTP(host)
        conn.set_timeout(self.timeout)
        return conn


class TimeoutServerProxy(xmlrpclib.ServerProxy):
    def __init__(self, uri, timeout=10, *l, **kw):
        kw['transport'] = TimeoutTransport(
            timeout=timeout, use_datetime=kw.get('use_datetime', 0))
        xmlrpclib.ServerProxy.__init__(self, uri, *l, **kw)


if __name__ == "__main__":
    s = TimeoutServerProxy('http://127.0.0.1:9090', timeout=2)
    s.dummy()
16
ответ дан 29 November 2019 в 20:09
поделиться

На основе версии от antonylesuisse, рабочей версии (на python> = 2.6).

# -*- coding: utf8 -*-
import xmlrpclib
import httplib
import socket

class TimeoutHTTP(httplib.HTTP):
   def __init__(self, host='', port=None, strict=None,
                timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
        if port == 0:
            port = None
        self._setup(self._connection_class(host, port, strict, timeout))

class TimeoutTransport(xmlrpclib.Transport):
    def __init__(self, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, *args, **kwargs):
        xmlrpclib.Transport.__init__(self, *args, **kwargs)
        self.timeout = timeout

    def make_connection(self, host):
        host, extra_headers, x509 = self.get_host_info(host)
        conn = TimeoutHTTP(host, timeout=self.timeout)
        return conn

class TimeoutServerProxy(xmlrpclib.ServerProxy):
    def __init__(self, uri, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
                 *args, **kwargs):
        kwargs['transport'] = TimeoutTransport(timeout=timeout,
                                    use_datetime=kwargs.get('use_datetime', 0))
        xmlrpclib.ServerProxy.__init__(self, uri, *args, **kwargs)
1
ответ дан 29 November 2019 в 20:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: