SORU
3 Mart 2013, Pazar


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:

  1. ruby/rails güvenli iş parçacığı nedir?VsRuby/rails iş parçacığı için güvenli nedir?
  2. Taşlar bir listesi variş parçacığı için güvenli olduğu bilinen ya da tersi?
  3. Listesi *örnek 3* iş parçacığı için güvenli OLMAYAN kod ortak kalıpları var mı?
  4. Veri Hash vb iş parçacığı için güvenli gibi ruby lang çekirdek yapılardır?
  5. 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
3 Mart 2013, Pazar


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; enddeğ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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ELPRESADOR

    ELPRESADOR

    21 HAZİRAN 2008
  • failblog

    failblog

    17 HAZİRAN 2008
  • FamilyFeud

    FamilyFeud

    22 AĞUSTOS 2006