C ++ 26: Vericiler, Adaptörler ve STD Tüketicilerin Fabrikaları :: Yürütme
Kapsayıcı taramanın eşzamansız yürütülmesinin vericilerin bileşimi ve açıklamaları std::execution Önceki makalelerimde zaten tedavi ettim. Şimdi kendimi üç tür ihraççıya adadım std::execution Teklifler: fabrikalar, adaptörler ve tüketiciler.
Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.
Vericiler hakkında aşağıdaki bilgiler esas olarak P2300R10 teklifinden gelir. Burada biraz daha özlü içeriği sunmaya çalışacağım.
Eldivenler fabrikası
Bir verici fabrikası bir algoritmadır,, Bir vericiyi parametre olarak kullanmayan ve bir vericiyi döndürenler.
execution::schedule
execution::sender auto schedule(
execution::scheduler auto scheduler
);
Sağlanan zamanlayıcı ile başlayan bir verici döndürür.
execution::just
execution::sender auto just(
auto ...&& values
);
Sağlanan değerleri gönderen bir vericiyi döndürür.
execution::just_error
execution::sender auto just_error(
auto && error
);
Belirli bir hata ile biten bir vericiyi döndürür.
execution::just_stopped
execution::sender auto just_stopped();
Hemen arayan bir verici döndürür set_stopped alıcının tamamlanması.
execution::read_env
execution::sender auto read_env(auto tag);
Bir alıcının çevreleyen ortamını ve mevcut değeri okuyan bir verici döndürür. tag-Geliştirme değeri bağlıdır. Ardından, değerin kanalındaki okuma değerini alıcıya döndürür. read_env(get_scheduler) Örneğin, şu anda önerilen zamanlayıcı ve BT'nin alıcısına soran bir vericidir set_value-Tzschlicht Alıcı sinyali geçer.
Bu, yuvalanmış ve çalışanların çalışmasını planlarken yararlı olabilir. Aşağıdaki ihraççı mevcut zamanlayıcıyı değer kanalında çeker ve bu nedenle işi daha da planlar.
Verici Adaptörü
Verici adaptörü, bir veya daha fazla vericiyi parametre olarak kullanan ve bir verici döndüren bir algoritmadır.
Gönderen adaptörü tembeldir. Gönderen tüketici gibi this_thread::sync_wait Vericiyi başlatın.
execution::continues_on
execution::sender auto continues_on(
execution::sender auto input,
execution::scheduler auto scheduler
);
Giriş kişinin yürütme aracısından ajan yürütme aracısına geçişi tanımlayan bir verici döndürür.
execution::then
Giriş istasyonu tarafından tarif edilen faaliyetlerin diyagramını tanımlayan bir verici döndürür. Bu şekilde, giriş istasyonundan konu olarak gönderilen değerlerle sağlanan işlevi hatırlamak için bir düğüm ekler.
execution::upon_*
upon_error VE upon_stopped Ben then Benzer, ama sırasında then Girilen değerlerden iş, işe yarıyor upon_error Hatalarla ve upon_stopped “Durdurulmuş” sinyal gönderildiğinde denir.
İçin açık bir örnek then,, upon_error VE upon_stopped STDEXEC prototip kütüphanesidir.
Aşağıdaki örnek, HTTP isteğinin bir yöneticisini göstermektedir.
/*
* Copyright (c) 2022 Lucian Radu Teodorescu
*
* Licensed under the Apache License Version 2.0 with LLVM Exceptions
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* https://llvm.org/LICENSE.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Handler for the "classify" request type
ex::sender auto handle_classify_request(const http_request& req) {
return
// start with the input buffer
ex::just(req)
// extract the image from the input request
| ex::then(extract_image)
// analyze the content of the image and classify it
// we are doing the processing on the same thread
| ex::then(do_classify)
// handle errors
| ex::upon_error(on_classification_error)
// handle cancellation
| ex::upon_stopped(on_classification_cancelled)
// transform this into a response
| ex::then(to_response)
// done
;
}
İşlev görüntüleri çıkarır ve bir ex::sender-Pepplet geri, diğer süreçlerden oluşabilen eşzamansız bir süreci temsil eder.
İşlev birine sürekli bir referans alır http_request req. Ayrıştırma boru hattı ile başlar. ex::just(req)-HTTP isteğinin giriş arabelleği ile başlayan bir verici oluşturur.
Boru hattı daha sonra dosyayı kullanır ex::then-Bir dizi süreci zincirlemek için işlev. İlk işlem, extract_imageGörüntüyü giriş isteğinden çıkarın. Bir sonraki işlem, çıkarılan görüntünün içeriğini sınıflandırır. Bu işlem aynı iş parçacığında gerçekleşir.
Hata tedavisi, işlevin yardımıyla kullanılır ex::upon_error fonksiyonun boru hattına entegre edilmiş on_classification_error Sınıflandırma işlemi sırasında meydana gelen hataların tedavisi için.
Aynı şekilde, işlev ex::upon_stopped işlemin sonunu tedavi etmek için kullanılır, böylece işlev on_classification_cancelled Verilir.
Sonunda işlev olur to_response Sınıflandırmanın sonucunu bir HTTP yanıtına dönüştürmek için kullanılır. Bu dönüşüm ayrıca ex::then-İşlev.
Bu kod, HTTP sorularının işlenmesi, görüntülerin sınıflandırılması, hatalar ve kesintiler için değiştirilebilir ve eşzamansız bir işleme boru hattını göstermektedir.
execution::starts_one
execution::sender auto starts_on(
execution::scheduler auto sched,
execution::sender auto snd
);
Bu verici adaptörü, vericinin gerçekleştirildiği yürütme kaynağını değiştirir. Vericiyi uyarlamaz.
Sırada ne var?
std::execution Bir sonraki gönderilerimi sunacağım başka vericiler adaptörleri var: execution::let_*, execution::into_variant,, execution::stopped_as_optional,, execution::stopped_as_error,, execution::bulk, execution::split VE execution::when_all.
(harita)
C ++ 26: Vericiler, Adaptörler ve STD Tüketicilerin Fabrikaları :: Yürütme
Kapsayıcı taramanın eşzamansız yürütülmesinin vericilerin bileşimi ve açıklamaları std::execution Önceki makalelerimde zaten tedavi ettim. Şimdi kendimi üç tür ihraççıya adadım std::execution Teklifler: fabrikalar, adaptörler ve tüketiciler.


Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.
Vericiler hakkında aşağıdaki bilgiler esas olarak P2300R10 teklifinden gelir. Burada biraz daha özlü içeriği sunmaya çalışacağım.
Eldivenler fabrikası
Bir verici fabrikası bir algoritmadır,, Bir vericiyi parametre olarak kullanmayan ve bir vericiyi döndürenler.
execution::schedule
execution::sender auto schedule(
execution::scheduler auto scheduler
);
Sağlanan zamanlayıcı ile başlayan bir verici döndürür.

execution::just
execution::sender auto just(
auto ...&& values
);
Sağlanan değerleri gönderen bir vericiyi döndürür.

execution::just_error
execution::sender auto just_error(
auto && error
);
Belirli bir hata ile biten bir vericiyi döndürür.
execution::just_stopped
execution::sender auto just_stopped();
Hemen arayan bir verici döndürür set_stopped alıcının tamamlanması.
execution::read_env
execution::sender auto read_env(auto tag);
Bir alıcının çevreleyen ortamını ve mevcut değeri okuyan bir verici döndürür. tag-Geliştirme değeri bağlıdır. Ardından, değerin kanalındaki okuma değerini alıcıya döndürür. read_env(get_scheduler) Örneğin, şu anda önerilen zamanlayıcı ve BT'nin alıcısına soran bir vericidir set_value-Tzschlicht Alıcı sinyali geçer.
Bu, yuvalanmış ve çalışanların çalışmasını planlarken yararlı olabilir. Aşağıdaki ihraççı mevcut zamanlayıcıyı değer kanalında çeker ve bu nedenle işi daha da planlar.

Verici Adaptörü
Verici adaptörü, bir veya daha fazla vericiyi parametre olarak kullanan ve bir verici döndüren bir algoritmadır.
Gönderen adaptörü tembeldir. Gönderen tüketici gibi this_thread::sync_wait Vericiyi başlatın.
execution::continues_on
execution::sender auto continues_on(
execution::sender auto input,
execution::scheduler auto scheduler
);
Giriş kişinin yürütme aracısından ajan yürütme aracısına geçişi tanımlayan bir verici döndürür.

execution::then
Giriş istasyonu tarafından tarif edilen faaliyetlerin diyagramını tanımlayan bir verici döndürür. Bu şekilde, giriş istasyonundan konu olarak gönderilen değerlerle sağlanan işlevi hatırlamak için bir düğüm ekler.

execution::upon_*
upon_error VE upon_stopped Ben then Benzer, ama sırasında then Girilen değerlerden iş, işe yarıyor upon_error Hatalarla ve upon_stopped “Durdurulmuş” sinyal gönderildiğinde denir.
İçin açık bir örnek then,, upon_error VE upon_stopped STDEXEC prototip kütüphanesidir.
Aşağıdaki örnek, HTTP isteğinin bir yöneticisini göstermektedir.
/*
* Copyright (c) 2022 Lucian Radu Teodorescu
*
* Licensed under the Apache License Version 2.0 with LLVM Exceptions
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* https://llvm.org/LICENSE.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Handler for the "classify" request type
ex::sender auto handle_classify_request(const http_request& req) {
return
// start with the input buffer
ex::just(req)
// extract the image from the input request
| ex::then(extract_image)
// analyze the content of the image and classify it
// we are doing the processing on the same thread
| ex::then(do_classify)
// handle errors
| ex::upon_error(on_classification_error)
// handle cancellation
| ex::upon_stopped(on_classification_cancelled)
// transform this into a response
| ex::then(to_response)
// done
;
}
İşlev görüntüleri çıkarır ve bir ex::sender-Pepplet geri, diğer süreçlerden oluşabilen eşzamansız bir süreci temsil eder.
İşlev birine sürekli bir referans alır http_request req. Ayrıştırma boru hattı ile başlar. ex::just(req)-HTTP isteğinin giriş arabelleği ile başlayan bir verici oluşturur.
Boru hattı daha sonra dosyayı kullanır ex::then-Bir dizi süreci zincirlemek için işlev. İlk işlem, extract_imageGörüntüyü giriş isteğinden çıkarın. Bir sonraki işlem, çıkarılan görüntünün içeriğini sınıflandırır. Bu işlem aynı iş parçacığında gerçekleşir.
Hata tedavisi, işlevin yardımıyla kullanılır ex::upon_error fonksiyonun boru hattına entegre edilmiş on_classification_error Sınıflandırma işlemi sırasında meydana gelen hataların tedavisi için.
Aynı şekilde, işlev ex::upon_stopped işlemin sonunu tedavi etmek için kullanılır, böylece işlev on_classification_cancelled Verilir.
Sonunda işlev olur to_response Sınıflandırmanın sonucunu bir HTTP yanıtına dönüştürmek için kullanılır. Bu dönüşüm ayrıca ex::then-İşlev.
Bu kod, HTTP sorularının işlenmesi, görüntülerin sınıflandırılması, hatalar ve kesintiler için değiştirilebilir ve eşzamansız bir işleme boru hattını göstermektedir.
execution::starts_one
execution::sender auto starts_on(
execution::scheduler auto sched,
execution::sender auto snd
);
Bu verici adaptörü, vericinin gerçekleştirildiği yürütme kaynağını değiştirir. Vericiyi uyarlamaz.
Sırada ne var?
std::execution Bir sonraki gönderilerimi sunacağım başka vericiler adaptörleri var: execution::let_*, execution::into_variant,, execution::stopped_as_optional,, execution::stopped_as_error,, execution::bulk, execution::split VE execution::when_all.
(harita)