Ожидание через join дает большие задержки, тем больше, чем больше количество отслеживаемых процессов и выше вероятность ошибки. Это связано с тем, что в случае join, в худшем случае придется дождаться завершения всех процессов, в то время, как при использовании channel выход осуществляется немедленно, связано это с архитектурными ограничениями join.
- Для имитации работы запускается N файберов, каждый из которых засыпает на случайное время, но не более 1 секунды
- С указанной вероятностью файбер вместо результата возвращает ошибку
- При получении ошибки от любого из файберов итерация завершается
tarantool ./bench.lua
Смотри файл bench.lua
:
local workers = 100
local chance_of_error = 98
local iterations = 100
workers: 10
chance of error, %: 2
iterations: 100
benchmarking of channel..
78.240322113037 seconds
benchmarking of join..
89.086318969727 seconds
workers: 10
chance of error, %: 50
iterations: 100
benchmarking of channel..
16.547489881516 seconds
benchmarking of join..
58.657691955566 seconds
workers: 100
chance of error, %: 2
iterations: 100
benchmarking of channel..
38.712564945221 seconds
benchmarking of join..
94.660372018814 seconds
workers: 100
chance of error, %: 50
iterations: 100
benchmarking of channel..
1.9756760597229 seconds
benchmarking of join..
61.734074115753 seconds```
Опытным путем удалось подтвердить, что реализация на join оказалась очень зависима от процента ошибок и количества ожидаемых процессов и является значительно менее эффективной, чем реализация на channel.