cPickle.UnpicklingError: данные рассола были усечены

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

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

Traceback (most recent call last):
  File "/home/manch011/disserver/src/disserver/gui/backends/receiver.py", line 69, in run
    name, args, kwargs = cPickle.load(connFile)
cPickle.UnpicklingError: pickle data was truncated

Это мой код на стороне сервера:

_exportedMethods = {
    'changes': signal_when_changes,
}  

class ServerThread(QtCore.QThread):

    def __init__(self):
        super(ServerThread,self).__init__()
        st = self
    #threading.Thread.__init__(self)
    def run(self):
        HOST = ''     # local host
        PORT = 50000
        SERVER_ADDRESS = HOST, PORT

        # set up server socket
        s = socket.socket()
        s.bind(SERVER_ADDRESS)
        s.listen(5)

        while True:
            conn, addr = s.accept()
            connFile = conn.makefile()
            name, args, kwargs = cPickle.load(connFile)
            res = _exportedMethods[name](*args,**kwargs)
            cPickle.dump(res,connFile) ; connFile.flush()
            conn.close()

А это клиентская сторона:

class RemoteFunction(object):
def __init__(self,serverAddress,name):
    self.serverAddress = serverAddress
    self.name = name
def __call__(self,*args,**kwargs):
    s = socket.socket()
    s.connect(self.serverAddress)
    f = s.makefile()
    cPickle.dump((self.name,args,kwargs), f) 
    f.flush()
    res = cPickle.load(f)
    s.close()
    return res

def machine_changed_signal(machine):
    HOST = ''
    PORT = 50000
    SERVER_ADDRESS = HOST, PORT
    advise = RemoteFunction(SERVER_ADDRESS,'changes')
    advise(machine)

Я не знаком с cPickle и, следовательно, не могу понять это, может ли кто-нибудь объяснить мне это?

Заранее спасибо Чис


person Chris    schedule 21.11.2011    source источник


Ответы (1)


Я решил свою проблему. Но сначала сообщение об ошибке, которое я описываю в своем вопросе, не имеет смысла.

Я решил новую проблему и использовал Pyro4 Framework. Итак, я получил новое сообщение об ошибке, которое было эквивалентно старому, но явно. Вы не можете рассолить объекты класса. Поскольку в моем случае мне нужны только значения атрибутов, я передаю это в простой словарь.

Сначала загрузите Pyro4 и установите его Простой пример, похожий на пример на домашняя страница Pyro:

# saved as helloworld.py
import Pyro4
import threading
import os
class HelloWorld(object):
    def get_hello_world(self, name):
        return "HelloWorld,{0}.".format(name)

#The NameServer had to run in a own thread because he has his own eventloop
class NameServer(threading.Thread):
    def __init__(self):
    threading.Thread.__init__(self)
    def run(self):
    os.system("python -m Pyro4.naming")
ns = NameServer()
ns.start()
hello_world=HelloWorld()
daemon=Pyro4.Daemon()                 # make a Pyro daemon
ns=Pyro4.locateNS()                   # find the name server
uri=daemon.register(hello_world)   # register the greeting object as a Pyro object
ns.register("example.helloworld", uri)  # register the object with a name in the name server
print "Ready."
daemon.requestLoop()                  # start the event loop of the server to wait for calls

запустите эту программу и выполните следующую после

# saved as client.py
import Pyro4
name=raw_input("What is your name? ").strip()
helloworld=Pyro4.Proxy("PYRONAME:example.helloworld")    # use name server object lookup uri shortcut
print helloworld.get_hello_world(name)

Важно: вы не можете передавать экземпляры класса. Таким образом, «имя» не может быть экземпляром класса.

person Chris    schedule 22.11.2011
comment
Не могли бы вы добавить код или пример того, как вы решили свою проблему? Если ссылка не работает или умирает, в этом посте нет информации, которая поможет будущим зрителям. - person Nightfirecat; 22.11.2011
comment
Да, это все, что мне было нужно - лично мне это не нужно, но другим людям может быть, и это будет гораздо полезнее. Спасибо за публикацию так быстро. :) - person Nightfirecat; 22.11.2011