Multiplex Çalışanları (Deneysel Özellik)

Sorun bildirin Kaynağı göster Gece · 7,4 , 7.3 · 7,2 · 7,1 · 7,0 · 6,5

Bu sayfada çoklu çalışanlar, çoklu uyumlu kuralların nasıl yazılacağı ve belirli sınırlamalar için geçici çözümler açıklanmaktadır.

Multiplex çalışanları, Bazel'in tek bir çalışanla birden fazla isteği ele almasına olanak tanır. bahsedeceğim. Bazel, çok iş parçacıklı çalışanlar için aynı veya daha iyi performans elde etmek amacıyla daha az kaynak kullanabilir. Örneğin, Bazel'de çalışan başına bir çalışan işlemi yerine, aynı çalışan işlemiyle iletişim kuran dört çoklu çalışan olabilir. Bu çalışan işlemi, istekleri paralel olarak işleyebilir. Java ve Scala gibi diller için bu, JVM ısıtma süresinden ve JIT derleme süresinden tasarruf sağlar ve genel olarak aynı türdeki tüm çalışanlar arasında tek bir paylaşılan önbelleğin kullanılmasına olanak tanır.

Genel Bakış

Bazel sunucusu ve çalışan işlemi arasında iki katman vardır. Belirli işlemleri paralel olarak yürütebilen anımsatıcılar, Bazel’ın WorkerProxy havuzda yer alır. WorkerProxy, istekleri çalışan işlemine yönlendirir çalışan işlemi, isteği request_id ile birlikte sırayla işler. ve yanıtları WorkerMultiplexer adlı kullanıcıya gönderir. WorkerMultiplexer bir yanıt aldığında request_id öğesini ayrıştırır ve ardından yanıtları iletir. WorkerProxy konumuna döndürmeniz gerekir. Multiplex özelliği olmayan çalışanlarda olduğu gibi, standart giriş/çıkış yoluyla yapılır, ancak araç yalnızca Kullanıcıların görebileceği çıkış için stderr (aşağıya bakın).

Her çalışanın bir anahtarı vardır. Bazel, anahtarın karma kodunu ( değişkenleri, yürütme kökü ve anımsatıcı) kullanarak hangi Kullanmak için WorkerMultiplexer. WorkerProxy'ler aynı Aynı karma koduna sahiplerse WorkerMultiplexer. Dolayısıyla, ortam değişkenleri ve yürütme kökü tek bir Bazel'de aynıdır her benzersiz anımsatıcı, yalnızca bir WorkerMultiplexer ve bir çalışma sürecidir. Normal çalışanlar ve WorkerProxy'ler dahil olmak üzere toplam çalışan sayısı --worker_max_instances ile sınırlı olmaya devam etmektedir.

Çoklu yayın uyumlu kuralları yazma

Kuralın çalışan işlemi, multiplex çalışanları. Protobuf, akışta birden fazla istek birikmiş olsa bile kural kümesinin tek bir isteği ayrıştırmasına olanak tanır. İşçi işlemi, akıştan bir istek ayrıştırdığında isteği yeni bir iş parçacığında işlemelidir. Çünkü farklı ileti dizileri tamamlanabilir ve şu adresteki akışa yazılabilir: aynı zamanda, çalışan süreci, yanıtların yazıldığından otomatik olarak (mesajlar çakışmaz). Yanıtlar şunu içermelidir: İşledikleri isteğin request_id kadarı.

Çoklu yayın çıkışını işleme

Çoklu kanallı çalışanların, çıktılarını işleme konusunda tek kanallı çalışanlara kıyasla daha dikkatli olmaları gerekir. stderr adresine gönderilen her şey, aynı türdeki tüm WorkerProxy'lar arasında paylaşılan tek bir günlük dosyasına gider ve eşzamanlı istekler arasında rastgele olarak yerleştirilir. stdoutstderr'a yönlendirmek iyi bir fikir olsa da bu çıktıyı WorkResponse'ın output alanına toplamayın. Aksi takdirde, kullanıcıya bozuk çıktı parçaları gösterilebilir. Aracınız yalnızca stdout veya stderr'e kullanıcı odaklı çıkış gönderiyorsa çoklu işleyicileri etkinleştirebilmek için bu davranışı değiştirmeniz gerekir.

Multiplex çalışanlarını etkinleştirme

Multiplex çalışanları varsayılan olarak etkin değildir. Bir kural kümesi, bir işlemin execution_requirements alanında supports-multiplex-workers etiketini kullanarak çoklu işleyicileri etkinleştirebilir (tıpkı supports-workers etiketinin normal işleyicileri etkinleştirmesi gibi). Normal çalışanlar kullanılırken olduğu gibi, kural kümesi düzeyinde (örneğin, --strategy=[some_mnemonic]=worker) veya genel olarak strateji düzeyinde (örneğin, --dynamic_local_strategy=worker,standalone) bir çalışan stratejisi belirtilmesi gerekir. Ek işaret gerekmez ve her ikisi de ayarlanmışsa supports-multiplex-workers, supports-workers'a göre önceliklidir. Multiplex çalışanlarını devre dışı bırakabilirsiniz dünya genelinde --noworker_multiplex geçti.

Bellek baskısını azaltmak ve performansı artırmak için mümkünse kural kümesinin çoklu işleyici kullanması önerilir. Ancak çoklu işleyiciler, çoklu korumalı alan uygulamadıkları sürece şu anda dinamik yürütme ile uyumlu değildir. Dinamik yürütmeyle korumalı olmayan çoklu işleyicileri çalıştırmaya çalışmak, bunun yerine korumalı tek işleyicileri sessizce kullanır.

Multiplex korumalı alanı

Çoklu işleyiciler, işleyici uygulamalarına açık destek ekleyerek korumalı alana alınabilir. Tek yönlü çalışan korumalı alan oluşturma işlemi her çalışan işlemi kendi korumalı alanında çalıştırırken, Multiplex çalışanları, çalışma dizinini oluşturabilirsiniz. İzin vermek için Multiplex çalışanlarının korumalı alana alınması için çalışan, yerine her istekte belirtilen bir alt dizine yazmak yerine doğrudan dizine ekleyeceksiniz.

Çalışanın, Multiplex korumalı alan kullanımını desteklemek için sandbox_dir alanını kullanması gerekir kodunu ekleyin ve bunu tüm dosya okuma ve yazma işlemleri için önek olarak kullanın.WorkRequest arguments ve inputs alanları, korumalı alan dışındaki bir istekle aynı kalsa da gerçek girişler sandbox_dir ile ilgilidir. İşleyici, arguments ve inputs'te bulunan dosya yollarını bu değiştirilmiş yoldan okumak için çevirmeli ve tüm çıkışları sandbox_dir'ye göre yazmalıdır. Buna, "." gibi yollar ve bağımsız değişkenlerde belirtilen dosyalarda bulunan yollar (ör. "argfile" bağımsız değişkenleri) dahildir.

Bir işleyici çoklu korumalı alan desteğini desteklediğinde kural kümesi, bir işlemin execution_requirements alanına supports-multiplex-sandboxing ekleyerek bu desteği belirtebilir. Ardından Bazel, Multiplex korumalı alanı kullanacaktır --experimental_worker_multiplex_sandboxing işareti geçilirse veya dinamik yürütme ile kullanılır.

Korumalı alana sahip bir Multiplex çalışanının çalışan dosyaları hâlâ çalışma dizinini oluşturur. Dolayısıyla, bir dosya hem çalışanın çalıştırılması için hem de giriş olarak kullanılıyorsa bu değer, hem çalışan hem de giriş olarak belirtilmelidir. işaret dosyası bağımsız değişkeninde, tools, executable veya runfiles.