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
Standart kütüphane Queue'a ne dersiniz? Eğer bütün bir kritik bölüm korumak için gerekirse
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
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.
- 1. piton iki listeleri birleştirin
- 2. Çatal orijinal GitHub projesiyle nasıl senkronize edilir?
- 3. AngularJS ile sunucu verileri nasıl senkronize edilir?
- 4. Android İki Async görevi nasıl senkronize edilir?
- 5. `package.lock`` package.json` ile nasıl senkronize edilir?
- 6. Julia CUDArt ile nasıl senkronize edilir?
- 7. Birden çok Backbone.js getirme nasıl senkronize edilir?
- 8. SoundPool'u Kullanarak Ses Nasıl Senkronize Edilir
- 9. github ile gitlab nasıl senkronize edilir
- 10. NSUserDefaults ne sıklıkla senkronize edilir?
- 11. svn sunucusu otomatik olarak senkronize edilir
- 12. Java Listeleri Listele Liste Listeleri
- 13. GitHub Windows istemcisindeki görünmeyen öğeler nasıl senkronize edilir?
- 14. Google App Engine'deki dev verileri nasıl senkronize edilir?
- 15. Kaydetmeye ihtiyacım yok. Emacs arabellekleri dosyalarla nasıl senkronize edilir?
- 16. Eclipse egit: Uzaktan repo ile nasıl senkronize edilir?
- 17. 2 git hesabında 2 git deposu nasıl senkronize edilir?
- 18. Git Sunucular 2 Sunucular arasında nasıl senkronize edilir
- 19. RequireJS ne zaman arama asenkron gerektirir? Ne zaman senkronize edilir?
- 20. nasıl piton
- 21. nasıl piton
- 22. piton
- 23. Listeleri nasıl olduğunu varsayalım Python
- 24. (piton)
- 25. piton
- 26. piton
- 27. piton
- 28. piton
- 29. piton
- 30. piton
bir "mylist.pop (0)" da atmoic midir? – willsteel
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
@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