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. stdout
'ü stderr
'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
.