çoklu işlem çatalı () - spawn ()
Python belgesinden ikisinin açıklamasını okuyordum :
yumurtlamak
Ana süreç yeni bir python yorumlayıcı sürecini başlatır. Alt süreç, yalnızca run () yöntemini çalıştırmak için gerekli olan kaynakları devralır. Özellikle, üst sürecin gereksiz dosya tanımlayıcıları ve tanıtıcıları miras alınmayacaktır. Bu yöntemi kullanarak bir işlemi başlatmak, çatal veya çatal sunucu kullanmaya kıyasla oldukça yavaştır. [Unix ve Windows'ta mevcuttur. Windows ve macOS için varsayılan.]
çatal
Üst süreç, Python yorumlayıcısını çatallamak için os.fork () kullanır. Alt süreç, başladığında, ana süreç ile etkili bir şekilde özdeştir. Ebeveynin tüm kaynakları çocuk süreç tarafından miras alınır. Çok iş parçacıklı bir işlemi güvenli bir şekilde çatallamanın sorunlu olduğunu unutmayın. [Yalnızca Unix'te mevcuttur. Unix'te varsayılan.]
Sorum şu:
- hangi kaynakların kopyalanacağını belirlemeye çalışmadığı için çatal çok daha hızlı mı?
- fork her şeyi kopyaladığından, spawn () ile karşılaştırıldığında çok daha fazla kaynağı "israf edecek" mi?
Yanıtlar
- hangi kaynakların kopyalanacağını belirlemeye çalışmadığı için çatal çok daha hızlı mı?
Evet, çok daha hızlı. Çekirdek, tüm süreci klonlayabilir ve yalnızca değiştirilmiş bellek sayfalarını bir bütün olarak kopyalar . Kaynakları yeni bir sürece aktarmak ve yorumlayıcıyı sıfırdan başlatmak gerekli değildir.
- fork her şeyi kopyaladığından, spawn () ile karşılaştırıldığında çok daha fazla kaynağı "israf edecek" mi?
Modern çekirdeklerdeki çatal, yalnızca " yazılırken kopyala" yapar ve yalnızca gerçekten değişen bellek sayfalarını etkiler. Uyarı, "yazma" nın zaten yalnızca CPython'daki bir nesne üzerinde yinelemeyi kapsamasıdır. Bunun nedeni, nesnenin referans sayısının artmasıdır.
Çok sayıda küçük nesnenin kullanıldığı uzun çalışan süreçleriniz varsa, bu, spawn ile olduğundan daha fazla bellek harcadığınız anlamına gelebilir. Anekdot olarak, Facebook'un Python süreçleri için "fork" dan "spawn" a geçerek bellek kullanımının önemli ölçüde azaldığını iddia ettiğini hatırlıyorum.