2016-04-13 27 views
1

Python, Celery ve cx_Oracle ile çalışıyorum.Eşzamanlı Kereviz görevleri ortak bir nesneyi paylaşıyor (DB bağlantısı)

Bir sürü işçiyi çalıştırıyorum. Bu çalışanlar bir veritabanı bağlantı nesnesini paylaşıyor.

Veritabanı bağlantı nesnesini (db_conn) bu şekilde oluşturuyorum. threaded=True parametresine Not:

db_conn = cx_Oracle.connect(user=db_user, 
          password=db_password, 
          dsn=dsn, 
          threaded=True) 

görevleri bu işçiler tarafından yürütülüyor tamamlanması birkaç saniye sürebilir bazı sorguları yürütme ağırlıklı olarak oluşur. Zamanla çakışan birkaç işçinin şansı (eşzamanlılık) oldukça yüksektir.

Soruma sorum: veritabanı bağlantı nesnesini (db_conn) paylaşırken herhangi bir özel önlem almalı mıyım?

Kereviz bu şeyleri otomatik olarak halleder mi? Yani, eğer bir görev veritabanı bağlantı nesnesini kullanıyorsa, Kereviz ilk işçinin çalışmasını bitirene kadar başka bir görev bekletir mi? Hayır ise, o zaman her çalışanın veritabanı bağlantısı nesnesini yalnızca başka bir çalışan onu kullanmadığında kullanmasına nasıl izin verebilirim?

cevap

1

Sorgulardan biri başarısız olduğunda ne olacağını bildiğinizden emin olabilirsiniz. Her yeni sorgu kendi işlemini başlatır mı? Bununla bittiğinde db bağlantısının düzgün bir şekilde kapatıldığından emin olmalısınız, ancak bu noktadan önce değil.

İşçiler arasında bu db bağlantısını paylaşmanızın gerçek bir nedeni var mı? Kereviz işçisi başına bir db bağlantısı, uygulanması, bakımı daha kolay, hatalara daha az eğilimli ve bağlantı açma/kapama bağlantılarında daha fazla kontrol sağlamanız için çok daha basittir. O zaman veritabanı bağlantınızın doğru sırada olmasını sağlamanız yerine python'daki eşzamanlılık sorunlarını çözebilirsiniz.

İlgili konular