Мне кажется, что сопрограммы отлично подходят для локальных взаимодействий между вызывающим и вызываемым абонентом, но мне сложно понять, как они заменят волокна.Рассмотрим приведенный ниже пример: я хотел бы контролировать уровень параллелизма, чтобы сбалансировать задержку ввода-вывода моего процессора и диска, поэтому я порождаю несколько производителей и один потребительский.
Можно ли реализовать нечто подобное с помощью сопрограмм?Разве нам не нужен какой-то планировщик, чтобы можно было манипулировать между нашими асинхронными процессами?
using namespace boost;
void read_lines_fiber(const string& fname, fibers::buffered_channel<string>& chan) {
my_fiber_file f(fname, 'r'); // fiber friendly, suspends on IO read.
for (string s : f) {
chan.push(std::move(s));
}
}
void consume_lines(fibers::buffered_channel<string>& chan) {
string line;
while (true) {
channel_op_status st = chan.pop(line);
if (st == channel_op_status::closed)
break;
// ... use line....
}
}
void orchestrator(const vector<string>& filenames) {
fibers::buffered_channel<string> chan;
fibers::fiber consumer(&consume_lines, std::ref(chan));
std::vector<fibers::fiber> producer_handles;
// Launch all the producer fibers.
// We might want to limit number of concurrent fibers using fiber friendly semaphore.
for (const auto& s : filenames) {
producer_handles.emplace_back(&read_lines_fiber, std::ref(chan));
}
for (auto& fb : producer_handles) {
fb.join();
}
chan.close();
consumer.join();
}