2011-06-09 20 views
30

Python'da yazılmış bir Veritabanı Uygulama Programlama Arabirimi oluşturmak ve SQLAlchemy'ı (veya bu tür bir görev için SQLAlchemy'ı kullanmanın iyi bir yol olmadığını söylemesi durumunda başka bir veritabanı bağlayıcısı) kullanmak istiyorum. . Kurulum, Linux veya BSD üzerinde çalışan bir MySQL sunucusudur ve bir Linux veya BSD makinesinde çalışan bir Python yazılımıdır (Yabancı veya yerel).Çok iş parçacıklı kullanımı SQLAlchemy

Temel olarak, ne yapmak istediğim her bağlantı için yeni bir iş parçacığı oluşturuyor ve her istek için yeni bir işlem (veya okudum gibi oturum açmak istiyorum) açmak istediğim halde protokol çok özel ve oldukça basit olurdu. Seansı vermem gerek. Şu anda karşı karşıya olduğum problem, başka bir oturumun aynı zamanda başka bir bağlantıdan meydana gelme olasılığının yüksek olmasıdır.

Buradaki sorum şu, bu durumla başa çıkmak için ne yapmalıyım?

  • Kilitleme kullanmalıyım, bu nedenle yalnızca tek bir oturum aynı anda çalışabilir mi?
  • Oturumlar gerçekten güvenli midir ve yanlış olduklarını düşünmek konusunda yanılıyor musunuz?
  • Bu durumu halletmenin daha iyi bir yolu var mı?
  • Gitmemek için yolu yoruyor mu?

cevap

33

Oturum nesneleri değil evreli vardır, amaparçacığı yereldir. From the docs:

bir anda yalnızca 'az bir iş parçacığı "Session nesne tamamen çoklu kullanım açısından anlamı bir olmayan eşzamanlı moda, kullanılmak üzere tasarlanmıştır' .. bazı süreç yerde olmak gerekiyor birçok iş parçacığı arasında mutltiple çağrıları aslında aynı oturum için bir tanıtıcıya sahip olmaz. Biz bu kavramı iş parçacığı yerel depolama alanı olarak adlandırıyoruz. " Varsayılan kullanımları ile

ScopedSession nesne [threading: Kendini konuları ve oturumları yönetme işi yapmak istemiyorsanız

, SQLAlchemy sizin için bu özen ScopedSession nesne vardır .local()] depolama olarak, ScopedSession kayıt defterine çağrı yapan herkes için tek bir Session tutulur, ancak yalnızca tek bir iş parçacığı kapsamında. Kayıt defterine farklı bir iş parçacığında çağrı yapan arayanlar, diğer iş parçacığı için yerel olan bir Oturum örneği alır.

Bu tekniği kullanarak, ScopedSession, birden çok iş parçacığı üzerinden çağrılması güvenli bir uygulamada, tek bir genel nesne sağlamanın hızlı ve nispeten basit bir yolunu sağlar.

Kendi evreli oturumları ayarlamak için Contextual/Thread-local Sessions örneklere bakınız:

# 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() 
+2

O 'session.remove()' değil mi? –

+4

@AllanRuin: "Oturum" ile sağlanan örnekte "some_session" kastediyorsanız, hayır. Bir 'session' nesnesinin' remove' yöntemi yoktur. Bu durumda, 'Session' bir' scoped_session' nesnesidir. Onun 'remove' yöntemi mevcut' session'ı tanımlar ve atmadan önce 'close' yöntemini çağırır. [Dokümanlar] [http://docs.sqlalchemy.org/en/latest/orm/contextual.html?vurgulamak =) # sqlalchemy.orm.scoping.scoped_session.remove kapsamlı. – bfin

+2

güncelleştirilmiş dokümanlar: http://docs.sqlalchemy.org/en/latest/orm/contextual.html – Mahdi

İlgili konular