C++26: Gönderen fabrikaları, bağdaştırıcıları ve std::execution tüketicileri
Vericilerin bileşimi ve kapsayıcı taramanın eşzamansız yürütülmesine ilişkin açıklamalar std::execution Daha önceki yazılarımda da bahsetmiştim. Şimdi dikkatimi üç tür kanala çevireceğim std::execution teklifler: fabrikalar, adaptörler ve tüketiciler.
Duyuru
Rainer Grimm uzun yıllardır yazılım mimarı, ekip ve eğitim yöneticisi olarak çalışmaktadır. C++, Python ve Haskell programlama dilleri üzerine makaleler yazmaktan hoşlanıyor, aynı zamanda özel konferanslarda sık sık konuşmaktan da hoşlanıyor. Modern C++ adlı blogunda C++ tutkusunu yoğun bir şekilde ele alıyor.
Aşağıdaki verici bilgileri öncelikle önerilen P2300R10'dan gelmektedir. Burada içeriği biraz daha özlü bir şekilde sunmaya çalışacağım.
Göndericinin fabrikası
Gönderici Fabrikası bir algoritmadır, gönderenleri parametre olarak kabul etmez ve bir göndereni döndürür.
execution::schedule
execution::sender auto schedule(
execution::scheduler auto scheduler
);
Sağlanan zamanlayıcıyla başlayan bir göndereni döndürür.
execution::just
execution::sender auto just(
auto ...&& values
);
Sağlanan değerleri gönderen göndereni döndürür.
execution::just_error
execution::sender auto just_error(
auto && error
);
Belirli bir hatayla biten göndereni döndürür.
execution::just_stopped
execution::sender auto just_stopped();
Aranarak hemen aranabilecek bir göndereni döndürür set_stopped alıcının işlemi tamamlandı.
execution::read_env
execution::sender auto read_env(auto tag);
Bir alıcının ortamını ve onunla ilişkili mevcut değeri okuyan bir vericiyi döndürür tag-Çevresel değer bağlantılıdır. Daha sonra okunan değeri değer kanalı üzerinden alıcıya gönderir. read_env(get_scheduler) örneğin, alıcıdan halihazırda önerilen zamanlayıcıyı isteyen ve bunu ona gönderen bir göndericidir set_value– Tamamlama sinyali alıcıdan iletilir.
Bu, iç içe ve bağımlı çalışmayı planlarken yararlı olabilir. Bir sonraki gönderen, geçerli zamanlayıcıyı değer kanalına ekler ve ardından üzerinde daha fazla çalışmayı planlar.
Verici adaptörü
Gönderici bağdaştırıcısı, bir veya daha fazla göndericiyi parametre olarak alan ve bir göndereni döndüren bir algoritmadır.
Verici adaptörleri tembeldir. Gönderenin tüketicileri bundan hoşlanıyor 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ş göndericisinin yürütme aracısından hedef zamanlayıcının yürütme aracısına geçişi açıklayan bir göndereni döndürür.
execution::then
Giriş göndereni tarafından açıklanan etkinlik diyagramını açıklayan bir göndereni döndürür. Bunu yaparak, girdiyi gönderen tarafından argüman olarak gönderilen değerlerle sağlanan işlevi çağıracak bir düğüm ekler.
execution::upon_*
upon_error VE upon_stopped ben then benzer, ancak sırasında then giriş göndereni tarafından gönderilen değerler çalışır upon_error hatalarla ve upon_stopped “dur” sinyali gönderildiğinde çağrılır.
Açık bir örnek then, upon_error VE upon_stopped stdexec prototip kütüphanesidir.
Aşağıdaki örnekte bir HTTP istek işleyicisi gösterilmektedir.
/*
* 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 ve girdileri çıkarır ex::senderDiğer işlemlerden oluşabilen eşzamansız bir işlemi temsil eden nesne.
İşlev sürekli olarak birine başvuruyor http_request req. İşleme hattı dosyayla başlar ex::just(req)-HTTP istek giriş arabelleğinden bir gönderen oluşturan işlev.
Boru hattı daha sonra dosyayı kullanır ex::then-Bir dizi işlemi zincirleme işlevi. İlk deneme extract_imagegörüntüyü giriş isteğinden çıkarır. 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 yönetimi fonksiyon kullanılarak yapılır ex::upon_error işlevi sağlayan boru hattına entegre edilmiştir on_classification_error Sınıflandırma işlemi sırasında ortaya çıkan hataları ele almak.
İşlev aynı olacak ex::upon_stopped operasyonun sonucunu yönetmek için kullanılır; burada fonksiyon on_classification_cancelled belirtilir.
Son olarak fonksiyon to_response sınıflandırma sonucunu bir HTTP yanıtına dönüştürmek için kullanılır. Bu dönüşüm aynı zamanda şu şekilde gerçekleşir: ex::then-İşlev.
Bu kod, HTTP istek işleme, görüntü sınıflandırma ve hata ve kesme işleme için şekillendirilebilir, eşzamansız bir işlem hattını gösterir.
execution::starts_one
execution::sender auto starts_on(
execution::scheduler auto sched,
execution::sender auto snd
);
Bu gönderen bağdaştırıcısı, gönderenin üzerinde çalıştığı yürütme kaynağını değiştirir. Kanalı ayarlamaz.
Bir sonraki adım nedir?
std::execution Sonraki yazılarımda tanıtacağım başka verici adaptörleri de 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: Gönderen fabrikaları, bağdaştırıcıları ve std::execution tüketicileri
Vericilerin bileşimi ve kapsayıcı taramanın eşzamansız yürütülmesine ilişkin açıklamalar std::execution Daha önceki yazılarımda da bahsetmiştim. Şimdi dikkatimi üç tür kanala çevireceğim std::execution teklifler: fabrikalar, adaptörler ve tüketiciler.
Duyuru
Rainer Grimm uzun yıllardır yazılım mimarı, ekip ve eğitim yöneticisi olarak çalışmaktadır. C++, Python ve Haskell programlama dilleri üzerine makaleler yazmaktan hoşlanıyor, aynı zamanda özel konferanslarda sık sık konuşmaktan da hoşlanıyor. Modern C++ adlı blogunda C++ tutkusunu yoğun bir şekilde ele alıyor.
Aşağıdaki verici bilgileri öncelikle önerilen P2300R10'dan gelmektedir. Burada içeriği biraz daha özlü bir şekilde sunmaya çalışacağım.
Göndericinin fabrikası
Gönderici Fabrikası bir algoritmadır, gönderenleri parametre olarak kabul etmez ve bir göndereni döndürür.
execution::schedule
execution::sender auto schedule(
execution::scheduler auto scheduler
);
Sağlanan zamanlayıcıyla başlayan bir göndereni döndürür.
execution::just
execution::sender auto just(
auto ...&& values
);
Sağlanan değerleri gönderen göndereni döndürür.
execution::just_error
execution::sender auto just_error(
auto && error
);
Belirli bir hatayla biten göndereni döndürür.
execution::just_stopped
execution::sender auto just_stopped();
Aranarak hemen aranabilecek bir göndereni döndürür set_stopped alıcının işlemi tamamlandı.
execution::read_env
execution::sender auto read_env(auto tag);
Bir alıcının ortamını ve onunla ilişkili mevcut değeri okuyan bir vericiyi döndürür tag-Çevresel değer bağlantılıdır. Daha sonra okunan değeri değer kanalı üzerinden alıcıya gönderir. read_env(get_scheduler) örneğin, alıcıdan halihazırda önerilen zamanlayıcıyı isteyen ve bunu ona gönderen bir göndericidir set_value– Tamamlama sinyali alıcıdan iletilir.
Bu, iç içe ve bağımlı çalışmayı planlarken yararlı olabilir. Bir sonraki gönderen, geçerli zamanlayıcıyı değer kanalına ekler ve ardından üzerinde daha fazla çalışmayı planlar.
Verici adaptörü
Gönderici bağdaştırıcısı, bir veya daha fazla göndericiyi parametre olarak alan ve bir göndereni döndüren bir algoritmadır.
Verici adaptörleri tembeldir. Gönderenin tüketicileri bundan hoşlanıyor 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ş göndericisinin yürütme aracısından hedef zamanlayıcının yürütme aracısına geçişi açıklayan bir göndereni döndürür.
execution::then
Giriş göndereni tarafından açıklanan etkinlik diyagramını açıklayan bir göndereni döndürür. Bunu yaparak, girdiyi gönderen tarafından argüman olarak gönderilen değerlerle sağlanan işlevi çağıracak bir düğüm ekler.
execution::upon_*
upon_error VE upon_stopped ben then benzer, ancak sırasında then giriş göndereni tarafından gönderilen değerler çalışır upon_error hatalarla ve upon_stopped “dur” sinyali gönderildiğinde çağrılır.
Açık bir örnek then, upon_error VE upon_stopped stdexec prototip kütüphanesidir.
Aşağıdaki örnekte bir HTTP istek işleyicisi gösterilmektedir.
/*
* 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 ve girdileri çıkarır ex::senderDiğer işlemlerden oluşabilen eşzamansız bir işlemi temsil eden nesne.
İşlev sürekli olarak birine başvuruyor http_request req. İşleme hattı dosyayla başlar ex::just(req)-HTTP istek giriş arabelleğinden bir gönderen oluşturan işlev.
Boru hattı daha sonra dosyayı kullanır ex::then-Bir dizi işlemi zincirleme işlevi. İlk deneme extract_imagegörüntüyü giriş isteğinden çıkarır. 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 yönetimi fonksiyon kullanılarak yapılır ex::upon_error işlevi sağlayan boru hattına entegre edilmiştir on_classification_error Sınıflandırma işlemi sırasında ortaya çıkan hataları ele almak.
İşlev aynı olacak ex::upon_stopped operasyonun sonucunu yönetmek için kullanılır; burada fonksiyon on_classification_cancelled belirtilir.
Son olarak fonksiyon to_response sınıflandırma sonucunu bir HTTP yanıtına dönüştürmek için kullanılır. Bu dönüşüm aynı zamanda şu şekilde gerçekleşir: ex::then-İşlev.
Bu kod, HTTP istek işleme, görüntü sınıflandırma ve hata ve kesme işleme için şekillendirilebilir, eşzamansız bir işlem hattını gösterir.
execution::starts_one
execution::sender auto starts_on(
execution::scheduler auto sched,
execution::sender auto snd
);
Bu gönderen bağdaştırıcısı, gönderenin üzerinde çalıştığı yürütme kaynağını değiştirir. Kanalı ayarlamaz.
Bir sonraki adım nedir?
std::execution Sonraki yazılarımda tanıtacağım başka verici adaptörleri de var: execution::let_*, execution::into_variant, execution::stopped_as_optional, execution::stopped_as_error, execution::bulk, execution::split VE execution::when_all.
(harita)