Multi-threaded use of SQLAlchemy

后端 未结 1 1567
灰色年华
灰色年华 2020-12-02 06:47

I want to make a Database Application Programming Interface written in Python and using SQLAlchemy (or any other database connectors if it is told that using SQLAlchemy for

相关标签:
1条回答
  • 2020-12-02 07:25

    Session objects are not thread-safe, but are thread-local. From the docs:

    "The Session object is entirely designed to be used in a non-concurrent fashion, which in terms of multithreading means "only in one thread at a time" .. some process needs to be in place such that mutltiple calls across many threads don’t actually get a handle to the same session. We call this notion thread local storage."

    If you don't want to do the work of managing threads and sessions yourself, SQLAlchemy has the ScopedSession object to take care of this for you:

    The ScopedSession object by default uses threading.local() as storage, so that a single Session is maintained for all who call upon the ScopedSession registry, but only within the scope of a single thread. Callers who call upon the registry in a different thread get a Session instance that is local to that other thread.

    Using this technique, the ScopedSession provides a quick and relatively simple way of providing a single, global object in an application that is safe to be called upon from multiple threads.

    See the examples in Contextual/Thread-local Sessions for setting up your own thread-safe sessions:

    # set up a scoped_session
    from sqlalchemy.orm import scoped_session
    from sqlalchemy.orm import sessionmaker
    
    session_factory = sessionmaker(bind=some_engine)
    Session = scoped_session(session_factory)
    
    # now all calls to Session() will create a thread-local session
    some_session = Session()
    
    # you can now use some_session to run multiple queries, etc.
    # remember to close it when you're finished!
    Session.remove()
    
    0 讨论(0)
提交回复
热议问题