Hi Mike

Great thanks, error seems gone.

On Sun, Jul 16, 2017 at 11:37 PM Mike Bayer <mike...@zzzcomputing.com>
wrote:

> it means like this (here, I adapt your SqlHelper into a recipe that is
> basically equivalent to the context manager at
>
> http://docs.sqlalchemy.org/en/latest/orm/session_basics.html#when-do-i-construct-a-session-when-do-i-commit-it-and-when-do-i-close-it
> )
>
>
> engine = create_engine(...)
> sessionmaker = sessionmaker(engine)
>
> class SqlHelper(object):
>     def __init__(self):
>         self.session = sessionmaker()
>
>     def __enter__(self):
>         return self
>
>     def __exit__(self ,type, value, traceback):
>         try:
>             if type:
>                self.session.rollback()
>             else:
>                self.session.commit()
>         finally:
>             self.session.close()
>
>     def insert(self, object):
>         self.session.add(object)
>
>     def delete(self, object):
>         self.session.delete(object)
>
>     # ...
>
>
> def run_in_gevent():
>     with SqlHelper() as helper:
>         for item in things_to_do():
>             helper.insert(...)
>             helper.delete(...)
>             # ...
>
> if __name__ = '__main__':
>     for i in range(num_workers):
>         spawn(run_in_gevent)
>
>    # .. etc
>
> Following the guidelines at
>
> http://docs.sqlalchemy.org/en/latest/orm/session_basics.html#when-do-i-construct-a-session-when-do-i-commit-it-and-when-do-i-close-it
> :
>
> "keep the lifecycle of the session separate and external from
> functions and objects that access and/or manipulate database data. "
> - we don't commit() the session in the same place that we are doing
> individual insert(), delete(), select() statements - we should have a
> single transaction surrounding a group of operations.
>
> "Make sure you have a clear notion of where transactions begin and
> end" - the SqlHelper() is used as a context manager, and that's when
> the transaction starts.  outside the "with:" block, the transaction is
> done.
>
> On Sat, Jul 15, 2017 at 9:16 PM, Tony Wang <plantpark....@gmail.com>
> wrote:
> > Hi Mike
> >
> > Thanks very much for your detailed reply. Very kind of you.
> >
> > For "threadlocal" strategy, I used without it for a long time but always
> > coming with "Runtime Error" that posted in BitBucket. I found some guys
> in
> > Gevent Group solved it by "threadlocal". I tried but error kept there.
> >
> > Little confusing about the second suggestion.  You mean put "sqlhelper =
> > SqlHelper()" outside of insert_data function, and let gevent workers
> share
> > the same engine and session? It doesn't work. If not,
> > could you share me some demo code?
> >
> > Thanks!
> >
> > On Sat, Jul 15, 2017 at 11:51 PM Mike Bayer <mike...@zzzcomputing.com>
> > wrote:
> >>
> >> On Fri, Jul 14, 2017 at 8:08 PM, Tony Wang <plantpark....@gmail.com>
> >> wrote:
> >> > I simplify a complex system of gevent with sqlachemy to a simple demo
> >> > code.
> >> >
> >> >
> >> > Before using of sqlachemy, pymysql is my best choice for communication
> >> > between MySql and gevent because of its easy and direct usage. But
> now I
> >> > feel a little confusing, what's the best way to make the two (gevent
> and
> >> > sqlachemy) work efficiently.
> >> >
> >> >
> >> > In pymysql case, though some "_io.BufferedReader " errors would
> happen,
> >> > it
> >> > doesn't affect the INSERT or UPDATE operations.
> >> >
> >> >
> >> > In sqlalchemy case, it's quite different in the opposite. Much more
> >> > errors
> >> > and little success.
> >> >
> >> >
> >> > After searching around for such errors, some
> >> >
> >> > solutions[
> https://groups.google.com/forum/#!searchin/gevent/SQLAlchemy/gevent/eGLfR7JV0kk/hg1kicBJeQkJ
> ]
> >> > for similar error didn't work.
> >> >
> >> >
> >> > Demo code :
> >> > https://gist.github.com/tonywangcn/6dadbd58d7778063b0c7969f62505537
> >>
> >> so first, do not use the "threadlocal" strategy.  It is legacy and
> >> should never be used:
> >>
> >>
> http://docs.sqlalchemy.org/en/latest/core/connections.html#using-the-threadlocal-execution-strategy
> >> . With gevent, I'd expect it to be disastrous:
> >>
> >> self.engine = create_engine(
> >> 'mysql+pymysql://root:password@localhost/test?charset=utf8',
> >> echo=True, pool_size=50, max_overflow=100, pool_recycle=3600,
> >> strategy='threadlocal')
> >>
> >> so remove that.
> >>
> >> Next, you are manipulating the private state of the QueuePool after
> >> its been constructed:
> >>
> >> self.engine.pool._use_threadlocal = True
> >>
> >> Never alter the value of an underscore variable in any library, the
> >> underscore means "private".   The effect of setting this flag after
> >> the fact is that the QueuePool will be in an essentially broken state
> >> since the constructor needs to know about this flag; in this specific
> >> case, the "threadlocal" engine strategy means the flag was already set
> >> in any case so it isn't having any effect, but this code should be
> >> removed.
> >>
> >> Next, you are creating many Engine objects, one for each operation via
> >> insert_data() -> SqlHelper() -> create_engine().  This is an
> >> antipattern as there should be exactly one Engine within the Python
> >> process for a given URL, and should be called at the module level,
> >> outside of the instantiation of objects (unless the object itself is
> >> created once-per-process).  same goes for the sessionmaker().
> >>
> >>
> >>
> >>
> >>
> >> >
> >> >
> >> > More details for error
> >> >
> >> >
> https://stackoverflow.com/questions/45113145/the-right-way-to-use-gevent-with-sqlalchemy
> >> >
> >> >
> >> > Thanks!
> >> >
> >> > --
> >> > SQLAlchemy -
> >> > The Python SQL Toolkit and Object Relational Mapper
> >> >
> >> > http://www.sqlalchemy.org/
> >> >
> >> > To post example code, please provide an MCVE: Minimal, Complete, and
> >> > Verifiable Example. See http://stackoverflow.com/help/mcve for a full
> >> > description.
> >> > ---
> >> > You received this message because you are subscribed to the Google
> >> > Groups
> >> > "sqlalchemy" group.
> >> > To unsubscribe from this group and stop receiving emails from it, send
> >> > an
> >> > email to sqlalchemy+unsubscr...@googlegroups.com.
> >> > To post to this group, send email to sqlalchemy@googlegroups.com.
> >> > Visit this group at https://groups.google.com/group/sqlalchemy.
> >> > For more options, visit https://groups.google.com/d/optout.
> >>
> >> --
> >> SQLAlchemy -
> >> The Python SQL Toolkit and Object Relational Mapper
> >>
> >> http://www.sqlalchemy.org/
> >>
> >> To post example code, please provide an MCVE: Minimal, Complete, and
> >> Verifiable Example.  See  http://stackoverflow.com/help/mcve for a full
> >> description.
> >> ---
> >> You received this message because you are subscribed to a topic in the
> >> Google Groups "sqlalchemy" group.
> >> To unsubscribe from this topic, visit
> >> https://groups.google.com/d/topic/sqlalchemy/wiAnfZQRHdw/unsubscribe.
> >> To unsubscribe from this group and all its topics, send an email to
> >> sqlalchemy+unsubscr...@googlegroups.com.
> >> To post to this group, send email to sqlalchemy@googlegroups.com.
> >> Visit this group at https://groups.google.com/group/sqlalchemy.
> >> For more options, visit https://groups.google.com/d/optout.
> >
> > --
> >
> > Tony Wang
> >
> > Warm Regards
> >
> > --
> > SQLAlchemy -
> > The Python SQL Toolkit and Object Relational Mapper
> >
> > http://www.sqlalchemy.org/
> >
> > To post example code, please provide an MCVE: Minimal, Complete, and
> > Verifiable Example. See http://stackoverflow.com/help/mcve for a full
> > description.
> > ---
> > You received this message because you are subscribed to the Google Groups
> > "sqlalchemy" group.
> > To unsubscribe from this group and stop receiving emails from it, send an
> > email to sqlalchemy+unsubscr...@googlegroups.com.
> > To post to this group, send email to sqlalchemy@googlegroups.com.
> > Visit this group at https://groups.google.com/group/sqlalchemy.
> > For more options, visit https://groups.google.com/d/optout.
>
> --
> SQLAlchemy -
> The Python SQL Toolkit and Object Relational Mapper
>
> http://www.sqlalchemy.org/
>
> To post example code, please provide an MCVE: Minimal, Complete, and
> Verifiable Example.  See  http://stackoverflow.com/help/mcve for a full
> description.
> ---
> You received this message because you are subscribed to a topic in the
> Google Groups "sqlalchemy" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/sqlalchemy/wiAnfZQRHdw/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> sqlalchemy+unsubscr...@googlegroups.com.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> Visit this group at https://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.
>
-- 

Tony Wang

Warm Regards

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to