2012-06-19 22 views
5

Farklı iş parçacıklarım var ve işledikten sonra verileri ortak bir listeye yerleştiriyorlar. Bir tek bir iş parçacığı tarafından erişilecek bir liste veya numpy dizi için python yerleşik bir şey var mı. İkincisi, bunu yapmanın zarif bir yolu değilse?Piton listeleri nasıl senkronize edilir?

cevap

1

Standart kütüphane Queue'a ne dersiniz? Eğer bütün bir kritik bölüm korumak için gerekirse

4

Thread synchronisation mechanisms in Python'a göre, listeden tek bir öğeyi okumak ve yerinde bir listeyi değiştirmek atomik olarak garanti edilir. Daha sonra, .append() tarafından yapılır mylist koymak

try: 
    val = mylist.pop() 
except IndexError: 
    # wait for a while or exit 
else: 
    # process val 

Ve her şey: (kısmen Kuyruk modülünün çok varlığı çelişki gibi görünüyor olsa da) Eğer bu doğruysa, o zaman kod formun tüm ise kodunuz zaten threadafe. Bu puan üzerindeki bir belgeye güvenmiyorsanız, eşzamanlı programlar için tüm senkronizasyonu gerçekleştiren ve eş zamanlı programlar için list'dan daha iyi bir API'ye sahip olan bir queue.queue kullanın; özellikle, süresiz olarak veya bir zaman aşımı engelleme seçeneği sunar .pop()'u beklemek için başka bir şeyiniz yoksa, iş parçacığı bu süre içinde başlıyor olabilir. Eğer bir üretici/tüketici kuyruğunda daha fazlasına ihtiyacınız

numpy diziler için

ve genel her durumda, threading bir Lock veya RLock kullanmak - bu yüzden onları kullanarak, bağlam yöneticisi protokolünü uygulayan oldukça basittir:

with mylock: 
    # Process as necessarry 

Python, with bloğunun sonuna düştüğünüzde kilidin serbest kalmasını garanti eder - yaptığınız bir şey istisna oluşturuyormuş gibi zor durumlarda da dahil olmak üzere.

Son olarak multiprocessing daha iyi bir uyum uygulamanız için threading daha olup olmadığını dikkate - Python ipler aslında aynı anda çalışacak garanti edilmez ve CPython sadece can C-düzey koduna damla eğer. multiprocessing, bu sorunu ortadan kaldırır, ancak bazı ek yüklere sahip olabilirsiniz - henüz yapmadıysanız, hangisinin sizin ihtiyaçlarınıza daha uygun olduğunu belirlemek için dokümanlar bölümünü okumalısınız.

+0

bir "mylist.pop (0)" da atmoic midir? – willsteel

+0

mylock ile: 'hatırlatma için teşekkürler. Imho RLocks bu yolla, nesne yönelimli programlamada kritik bölümleri korumak için genellikle en net deyimdir. – jjmontes

+0

@willsteel kesin bir cevap için, listelerin nasıl uygulandığına dair Python kaynak koduna bakmanızı öneririm, ama * hayal ediyorum * mylist.pop() 'ise," mylist.pop (0) "atomik olur (ki bu da kesin olarak cevaplayamıyorum, bu yüzden diğer senkronizasyon yöntemlerinden de bahsediyorum, ayrıca Python uygulamalarında da değişebilir). Özellikle, CPython * daki tüm C seviyesi kodları GIL tarafından korunabilir (ancak serbest bırakma seçeneğine sahiptir). 'pop' (muhtemelen) ya argümanı ne olursa olsun GIL'i serbest bırakır. – lvc