Thanks a lot for the suggestions, I will give it a much closer look
now...

Lynton

On Dec 18, 7:19 pm, "Michael Bayer" <mike...@zzzcomputing.com> wrote:
> Lynton Grice wrote:
> > Hi there,
>
> > I am writing a little persistant Queue class/s using sqlalchemy and
> > sqlite. All is going fine with the development but now I have reached
> > the stage where I would like to have each request spawned as a new
> > process (from Python's muliprocessing module).
>
> The result of "sessionmaker()" is a class.  Its defined at the module
> level and should be globally present in memory, and automatically
> available to any child processes that are spawned thereafter.   It's not
> something that's really appropriate to be passing around even within a
> single process in most cases - its part of your application's globally
> available structure.
>
> Additionally, when you use multiprocessing, any arguments passed across
> the boundary of a process are pickled, sent over a pipe, and then
> unpickled on the other side.  For this reason, it is critical that the
> arguments passed between parent/child are minimized in terms of their
> size.   This is in the multiprocessing 
> docs:http://docs.python.org/library/multiprocessing.html#programming-guide...
> .  So I would also argue that you really shouldn't be passing *any*
> significant state across process boundaries.   I would pass only small
> easily-packageable bits of state that are just enough for the child
> process to reconstruct what it needs from the application's global state
> as well as the database.  Things like classes, sessions, engines,
> connections and transactions are not candidates for sending over a pipe.
>
>
>
>
>
> > The error I am getting is: "Can't pickle <class
> > 'sqlalchemy.orm.session.Session'>" it's not the same object as
> > sqlalchemy.orm.session.Session
>
> > pickle.PicklingError:
>
> > In my one class that is the closest to SQLite I have the following in
> > the INIT method:
>
> > def __init__(self, queueConnection):
> >             self._queue = queueConnection.queue
> >             self._queueName = queueConnection.queue.name
> >             self._engine = queueConnection.engine
> >             self._sessionmaker = sessionmaker(bind=self._engine)
> >             self._session = self._sessionmaker()
> >             mapper(_Message, self._queue)
>
> > And if the calling client called the "SEND" method to send a message
> > to the queue...the code is as follows:
>
> > def send(self, message, timeout=10, callback=None):
> >             start_pipe, end_pipe = Pipe()
> >             start_pipe.send(message)
> >             p = Process(target=self._queue_proxy.send, args=
> > (end_pipe,)).start()
> >             result = p.join(timeout = timeout)
> >             if result == False:
> >                   return "Timeout"
> >             else:
> >                   return start_pipe.recv()
>
> > The exception is raised when the following line of code runs above:
>
> > p = Process(target=self._queue_proxy.send, args=(end_pipe,)).start
> > ()
>
> > NOTE: The "self._queue_proxy" object above is essentailly the object
> > that holds the reference to the "SessionMaker" above.
>
> > Does anyone have any idea how I can get around this Pickling error?
>
> > Any help will be greatly appreciated ;-)
>
> > Lynton
>
> > --
>
> > You received this message because you are subscribed to the Google Groups
> > "sqlalchemy" group.
> > To post to this group, send email to sqlalch...@googlegroups.com.
> > To unsubscribe from this group, send email to
> > sqlalchemy+unsubscr...@googlegroups.com.
> > For more options, visit this group at
> >http://groups.google.com/group/sqlalchemy?hl=en.- Hide quoted text -
>
> - Show quoted text -

--

You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.


Reply via email to