Функция бенч1(бд) дтнач = ТекущаяДата() ОбработатьСерв = Функция (соед) база = соед.Данные() запр = соед.Получить() Сообщить("Сервер получил соединение:",соед) Сообщить("Получен запрос:",запр) // транзакция с записью - может быть только одна в один момент времени, но она не мешает транзакциям чтения тр = база.НачатьТранзакцию(Истина) Попытка тр.Таблица("testing").Установить(Формат("%s",соед), запр) тр.ЗафиксироватьТранзакцию() Исключение тр.ОтменитьТранзакцию() Сообщить("Транзакция отменена!") КонецПопытки КонецФункции серв = Новый Сервер Попытка серв.Открыть("tcp", "127.0.0.1:9990", 20, ОбработатьСерв, бд) Исключение Сообщить(ОписаниеОшибки()) Сообщить("Кажется сервер уже запущен, или тут какая-то другая ошибка, но мы все равно попробуем отправить запрос :)") КонецПопытки клиенты = [] гр = Новый ГруппаОжидания фобр = Функция (соед) д = соед.Данные() Сообщить("Устанавливаем соединение:",соед) запр={ "id":соед.Идентификатор(), "query":"Запрос по tcp протоколу", "num":д[1], } Сообщить("Отправляем:", запр) соед.Отправить(запр) д[0].Завершить() КонецФункции Для н=1 по 20 Цикл кли = Новый Клиент гр.Добавить(1) кли.Открыть("tcp", "127.0.0.1:9990", фобр, [гр, н]) клиенты += кли КонецЦикла гр.Ожидать() серв.Закрыть() Возврат ПрошлоВремениС(дтнач) КонецФункции Функция бенч2(бд) дтнач = ТекущаяДата() ОбработатьHTTP = Функция (вых,вх) база = вх.Данные() запр = вх.Сообщение() Сообщить("Сервер получил запрос:\n", запр) тр = база.НачатьТранзакцию(Истина) Попытка тр.Таблица("testing").Установить(вх.Адрес(), запр) тр.ЗафиксироватьТранзакцию() вых.Отправить({"Статус":200, "Тело":"Запрос обработан успешно"}) Исключение тр.ОтменитьТранзакцию() Сообщить("Транзакция отменена!") вых.Отправить({"Статус":501, "Тело":"Проблемы с записью в базу данных"}) КонецПопытки КонецФункции серв = Новый Сервер Попытка серв.Открыть("http", "127.0.0.1:9990", 20, {"/test":ОбработатьHTTP}, бд) Исключение Сообщить(ОписаниеОшибки()) Сообщить("Кажется сервер уже запущен, или тут какая-то другая ошибка, но мы все равно попробуем отправить запрос :)") КонецПопытки гр = Новый ГруппаОжидания фобр = Функция (соед) д = соед.Данные() Сообщить("Устанавливаем соединение:",соед) запр={ "Метод": "GET", "Путь": "http://127.0.0.1:9990/test", "Заголовки": { "ReqId":соед.Идентификатор(), }, "Параметры": { "id":соед.Идентификатор(), "query":"Запрос по http протоколу", "num": д[1], }, } Сообщить("Отправляем:", запр) Попытка Сообщить("Ответ",д[1],":",соед.Запрос(запр)) Исключение Сообщить(ОписаниеОшибки()) КонецПопытки соед.Закрыть() д[0].Завершить() // группа ожидания КонецФункции Для н=1 по 20 Цикл кли = Новый Клиент // это асинхронный вариант: гр.Добавить(1) кли.Открыть("http", "127.0.0.1:9990", фобр, [гр, н]) // это синхронный вариант (раскомментируйте, закомментировав выше асинхронный вариант): // соед = кли.Соединить("http","") // Попытка // Сообщить("Ответ",н,":",соед.Запрос({ // "Метод": "GET", // "Путь": "http://127.0.0.1:9990/test", // "Заголовки": { // "ReqId":соед.Идентификатор(), // }, // "Параметры": { // "id":соед.Идентификатор(), // "query":"Запрос по http протоколу", // "num": н, // }, // })) // Исключение // Сообщить(ОписаниеОшибки()) // КонецПопытки // кли.Закрыть() КонецЦикла гр.Ожидать() серв.Закрыть() Возврат ПрошлоВремениС(дтнач) КонецФункции // Результаты запоминаем в базе данных база = Новый ФайловаяБазаДанных база.Открыть("test.db") Сообщить("Все завершилось просто идеально: TCP за", бенч1(база), ", HTTP за", бенч2(база), "!") // транзакция чтения - таких может быть сколько угодно, в разных горутинах тран = база.НачатьТранзакцию(Ложь) Попытка Сообщить(тран.Таблица("testing").ПолучитьВсе()) тран.ОтменитьТранзакцию() // при чтении транзакция закрывается только таким способом Исключение тран.ОтменитьТранзакцию() Сообщить(ОписаниеОшибки()) КонецПопытки база.Закрыть()