2012-08-07 20 views
6

Python iş parçacığı ve işlemlerini (birbiriyle ilişkili değil) adlandırılmış kilitle (örneğin dosya kilidi) eşzamanlamalıyım. Tercihen okuyucu-yazar kilidi olmalıdır. Ben fcntl.flock denedi (Bu özel ve paylaşılan kilit edinme hem var) ama kilitleme istenilen düzeyde sağlamaz - Does python's fcntl.flock function provide thread level locking of file access?Python için paylaşılan ve özel adlandırılmış kilit

Benim çözümüm şimdiye kadar memcached (veya mmap kilitli dosyası) ile lockfile kullanmaktır. Lockfile erişimi senkronize edecek ve memcached okuyucuları/yazarları sayacaktır.

Daha iyi/daha hızlı çözümler var mı? Bu sorunu zaten çözen herhangi bir proje biliyor musunuz?

+0

Herhangi bir çözümle ilgilenirim. – cji

+0

[İlock] (https://github.com/symonsoft/ilock) kütüphanesini deneyin – Symon

cevap

2

Burada, posix ve system V semaforlarını uygulayan kütüphaneler olan bir http://semanchuk.com/philip/ linki bulunmaktadır. Bunlardan birini kullanabilirsiniz. Gerçi, semaphore tutan işlemin, onu serbest bırakmadan öldüğü bir durumda, bunun dışında kalmayın. Bundan korkuyorsanız - System V Semaforlarını UNDO ile kullanabilirsiniz, ancak biraz daha yavaşlar. Ayrıca, System V paylaşımlı bellek ilkellerini kullanacaksanız, çekirdekte yaşadıklarını ve süreç sonlandırıldıktan sonra da yaşamaya devam ettiklerini unutmayın - bunları sistemden açıkça kaldırmanız gerekir. Eğer ilgili süreçleri ve tüm sistemin ve süreçlerin kilitlenme ölmekten korkuyor değilseniz

- (. Onlar POSIX adlı semaforlar vardır) Eğer Python en Semaphore kullanabilirsiniz

Eğer ilgili soru (fcntl) olarak bağlantılı sayfasının, fcntl'in ara diş kilitleme için uygun olmadığını söylemiyorum. Fcntl'in fds hakkında umurunda olduğunu söylüyor. Böylece kilitleme dosyasını açtığınız ve her kilit örneği için yeni fd aldığınız sürece süreçler arası ve inter-thread kilitleme için fcntl kullanabilirsiniz.

Ayrıca, iç içe geçmeli kilitleme için süreçler arası ve python'un semaforu için fcntl bileşimini de kullanabilirsiniz. Son olarak: mimarinizi yeniden düşünün. Kilitleme genellikle kötüdür. Kaynağı kilitlemeden halledecek bir sürece verin. Bunu sürdürmek çok daha kolay olacak. İnan bana.

İlgili konular