nasıl güvenli iplik yakut DEĞİL biliyor musun?
starting from Rails 4 Her şey varsayılan olarak dişli ortamda çalışmak gerekir. Bu demektir ki kodu yazınVE_TÜM_ kullandığımız taşlar threadsafe
olması gerekmektedir
yani, bu konuda birkaç sorum var:
- ruby/rails güvenli iş parçacığı nedir?VsRuby/rails iş parçacığı için güvenli nedir?
- Taşlar bir listesi variş parçacığı için güvenli olduğu bilinen ya da tersi?
- Listesi *örnek 3* iş parçacığı için güvenli OLMAYAN kod ortak kalıpları var mı?
- Veri
Hash
vb iş parçacığı için güvenli gibi ruby lang çekirdek yapılardır? - MRG, orada sadece 1 yakut iplik anlamına gelen
GVL
/GIL
IO
hariç aynı anda çalıştırabilirsiniz iş parçacığı için güvenli değişikliği bizi etkiler mi?
CEVAP
Temel veri yapıları hiçbiri iş parçacığı güvenlidir. Ruby ile birlikte gelen tek bir standart kütüphane (require 'thread'; q = Queue.new
) sıra uygulamasıdır.
MR GİL parçacığı güvenlik sorunları bizi kaydetmez. Sadece emin bu iki konu Ruby kod çalıştırılamaz hale getiriraynı zamandayani aynı anda iki farklı CPU. İpler hala durdurulmuş ve kodunuzda herhangi bir noktada yeniden başladı. Eğer @n = 0; 3.times { Thread.start { 100.times { @n = 1 } } }
vs. gibi kod birden çok iş parçacığı tarafından paylaşılan bir değişken mutasyona yazarsanız, ortak değişkenin değerini sonradan Belirli değil. GİL doğru eşzamanlı yazma programları temel konularda değişmez tek çekirdekli bir sistem daha fazla veya daha az bir simülasyon.
Eğer MR node.js gibi tek dişli olsaydı bile yine de eşzamanlılık hakkında düşünmek gerekir. Artan değişken ile örnek düzgün çalışır, ama hala bir şeyleri olmayan deterministik sırada gerçekleşen ve bir geri arama başka bir sonucu sinsice yakalıyor, yere seriyor nerede yarış koşulları alabilirsiniz. Tek dişli asenkron sistemler hakkında neden daha kolaydır, ama eşzamanlılık sorunları arınmış değildir. Düşün bir uygulama ile birden çok kullanıcı: eğer iki kullanıcı çarptı düzenleme üzerinde bir Yığın Taşması sonrası aşağı yukarı aynı zaman, harcamak biraz zaman düzenleme sonrası basın ve kaydetmek olan değişiklikler görülür bir üçüncü kullanıcı daha sonra ne zaman onlar okumak aynı yazı?
Diğer çoğu eş zamanlı çalışma gibi ruby'de, birden fazla operasyon olduğunu ve hiçbir iş parçacığı güvenli değil. @n = 1
birden fazla operasyon çünkü iş parçacığı güvenli değil. @n = 1
iş parçacığı güvenli çünkü bir işlem (birçok işlemler başlık altında, ve ben de muhtemelen başının dertte varsa denedim, tarif bu yüzden "iş parçacığı güvenli" ayrıntı, ama sonunda, sen-ecek değil almak tutarsız sonuçlar atamaları). * *12, ve başka hiçbir kestirme işlemi Atama ya. Birçok kez yaptığım tek bir hata tüm iş parçacığı güvenli değil return unless @started; @started = true
, yazıyor.
Bilmiyorum, herhangi bir yetkili listesi iş parçacığı güvenli olmayan parçacığı güvenli açıklamaları Ruby, ama basit bir kural: eğer bir ifade yalnızca bir (yan etkisi ücretsiz) ameliyat muhtemelen iş parçacığı güvenli. a b
Tamam, a = b
Tamam, a.foo(b)
Tamam . örneğin: ^em>yöntemi foo
-yan etkisi ücretsizdir(sadece Ruby hakkında bir şey olduğundan bir yöntem çağrısı, birçok durumda atama bile, bu diğer örnekler için de geçerli). Yan etkileri bu bağlamda devlet değiştiren şeyler ifade eder. def foo(x); @x = x; end
değilyan etkisi ücretsiz.
Ruby'de iş parçacığı güvenli kod hakkında en zor şeylerden biri tüm temel veri yapıları, dizisi, karma ve string dahil olmak üzere, değiştirilebilir. Çok kolay yanlışlıkla devlet bir parça sızıntısı var, ve bu parça da değişken olduğunda işler iyice karıştı. Aşağıdaki kodu göz önünde bulundurun:
class Thing
attr_reader :stuff
def initialize(initial_stuff)
@stuff = initial_stuff
@state_lock = Mutex.new
end
def add(item)
@state_lock.synchronize do
@stuff << item
end
end
end
Bir örnek bu sınıfı paylaşılabilir arasında ipler ve güvenli bir şekilde eklemek için, ama orada bir eşzamanlılık hata (değil tek bir tane): iç durumunu nesne sızıntıları ile stuff
erişimci. Saklama açısından sorunlu olmasının yanı sıra, aynı zamanda eşzamanlılık solucanlar bir kutu açılır. Belki birisi bu dizi alır ve başka bir yere geçer ve bu kodu şimdi bu dizinin sahibi ve istediği her şeyi yapabileceğini düşünüyor.
Ruby başka bir klasik örnek şu:
STANDARD_OPTIONS = {:color => 'red', :count => 10}
def find_stuff
@some_service.load_things('stuff', STANDARD_OPTIONS)
end
find_stuff
güzel kullanıldığını ilk kez çalışır, ama başka bir şey ikinci kez döner. Neden? load_things
yöntemi seçenekleri karma geçirildi sahibi düşünüyor, ve color = options.delete(:color)
. Şimdi STANDARD_OPTIONS
sürekli aynı değeri artık yok. Sabitler, veri sürekliliği garanti değil diyorlar yapıları referans ne yalnızca sabit. Şimdi bu kodu aynı anda çalıştırırsanız olacağını düşünüyorum.
Eğer paylaşılan kesilebilir devlet (karma ve diziler birden çok iş parçacığı tarafından erişilen gibi nesneleri, birden çok iş parçacığı, veri yapıları tarafından erişilen örneğin örnek değişkenler) kaçınırsanız iş parçacığı güvenliği çok da zor değil. Aynı anda erişilen uygulama parçaları en aza indirmek için deneyin, ve odak çabaları var. IIRC, bir Rails uygulaması, yeni bir denetleyici nesnesi oluşturulur her istek, sadece gidiş için kullanılan tek iş parçacığı ve aynı gider için herhangi bir model nesneler oluşturma o denetleyici. Ancak, Rayları da teşvik kullanımı genel değişkenler (User.find(...)
kullandığı global değişken User
olabilir ama bence sadece bir sınıf, bir sınıf, ama aynı zamanda bir ad alanı için genel değişkenler), bunlardan bazıları güvenli çünkü onlar salt okunur, ama bazen kaydedin şeyler bunlar global değişkenler, çünkü uygun. Genel olarak erişilebilen bir şey kullanırken çok dikkatli olun.
Oldu Olası koş Raylar dişli ortamlar için uzunca bir süre şimdi, bu yüzden olmadan bir Raylar uzman ediyorum hala anlamak ne kadar söylemek zorunda değilsin merak edecek bir iş parçacığı güvenliği gelince Raylar kendisi. Hala yukarıda bahsettiğim şeyler yaparak iş parçacığı güvenli olmayan Raylar uygulamaları oluşturabilirsiniz. Gelince diğer taşlar farz değildir parçacığı güvenli sürece derler ve eğer söyledikleri bunlar farz değildir, ve bak kendi kod (ama sadece çünkü onlar gitmek gibi şeyler @n ||= 1
gelmez değil, iş parçacığı güvenli, tamamen yasal bir şey yapılması gerektiğini düşünüyorsunuz siz ... yerine bakmak için şeyler gibi kesilebilir devlet genel değişkenler, nasıl işlediği değişken nesneleri geçirilen yöntemleri, ve özellikle nasıl seçenekleri karma işler).
Son olarak, iş parçacığı güvenli olmayan olmak geçişli bir özelliktir. İş parçacığı güvenli kendi iş parçacığı için güvenli değil olmayan bir şey kullanan bir şey.
Nasıl silmek mi []'bir dizi s bil...
Nasıl 'hata' ne anlama geldi...
Nasıl birim testleri yazarken test ne ...
Nasıl eğer memcached bir şey yaptığını...
Nasıl div içeriğini daha büyük değil y...