pickle problem
castironpi at gmail.com
castironpi at gmail.com
Mon May 12 01:27:40 EDT 2008
On May 11, 6:21 pm, krustymon... at gmail.com wrote:
> On May 8, 7:29 pm, castiro... at gmail.com wrote:
>
>
>
>
>
> > On May 8, 4:35 pm, Hrvoje Niksic <hnik... at xemacs.org> wrote:
>
> > > Marc 'BlackJack' Rintsch <bj_... at gmx.net> writes:
>
> > > > On Thu, 08 May 2008 08:55:35 -0700, krustymonkey wrote:
>
> > > >> The thing is, I'm not using slots by choice. I'm using the standard
> > > >> lib "socket" class, which apparently uses slots.
>
> > > > `socket` objects can't be pickled. Not just because of the
> > > > `__slot__`\s but because a substantial part of their state lives in
> > > > the operating system's space.
>
> > > Of course, if it makes sense to pickle sockets in the application, one
> > > is can do so by defining __getstate__ and __setstate__:
>
> > > class Connection(object):
> > > def __init__(self, host, port):
> > > self.host = host
> > > self.port = port
> > > self.init_sock()
>
> > > def init_sock(self):
> > > self.sock = socket.socket()
> > > self.sock.connect((host, port))
> > > ... init communication ...
>
> > > def __getstate__(self):
> > > # pickle self as a (host, port) pair
> > > return self.host, self.port
>
> > > def __setstate__(self, state):
> > > # reinstate self by setting host and port and
> > > # recreating the socket
> > > self.host, self.port = state
> > > self.init_sock()
>
> > I, local, am mystified that you'd want to pickle a socket. It's a
> > live connection, which flies on a pocket dollar. You don't want it on
> > disk, do you?
>
> > If you're running a net buoy through a cluster somewhere, do you want
> > to drop a server and reconnect? Is Amazon's EC2 up and running?
>
> > Certainly no one was talking on the internet. Were you?
>
> > I don't think you hit anything but banks surfing the web, and the
> > American dollar is notoriously stuffy. Pump a wi-fi to a diner,
> > though, and you're just talking more. Where's Usenet?
>
> The idea is a pre-fork socket server. What I want to do is fork off
> some child processes from the parent and use IPC to send the
> connection object (via socket.accept()) over a pipe to one of the
> preexisting child processes and have said child handle the
> transaction. Think Apache, if you want an example of what I'm trying
> to do here. This alleviates the process startup cost that occurs when
> you fork. If the socket object can't be serialized, is there another
> way to go about handling this in python?- Hide quoted text -
>
> - Show quoted text -
That's out of my expertise. You would have to either hack it on a
router you are running (masquerade), or choose a different family of
sockets. For HTTP, you could issue a 'reroute' return. Just multi-
thread your server process.
More information about the Python-list
mailing list