powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Асинхронное API для клиента
25 сообщений из 54, страница 1 из 3
Асинхронное API для клиента
    #40133763
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гугл не помог. Существуют ли в природе? Если нет, то планируется ли?
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40133767
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не существует. В пределах официального проекта не планируется.

Как ты его себе представляешь и зачем? Просто несколько коннектов в разных
потоках не помогут?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40133770
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как раз ради того, чтобы не делать по коннекту на поток. С асинхронным API возможно работать с кучей соединений даже в одном потоке. А если ещё и язык поддерживает асинхронные операции, то использование такого API почти ничем не отличается от использования обычного API.
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40133773
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDenС асинхронным API возможно работать с кучей соединений даже в одном потоке. А
если ещё и язык поддерживает асинхронные операции, то использование такого API
почти ничем не отличается от использования обычного API.

Совершенно отличается. Одна только "неприкосновенность буферов до реального
выполнения операции" способна сорвать крышу каждому первому дельфину.

Когда ты последний раз работал с реально асинхронным вводом-выводом, например?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40133775
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про неприкосновенность буферов не понял.
Последний раз работал на этой неделе. Просто задействовал асинхронное api для файловых операций. Оно работает из коробки и не требует выдающихся умений у программиста )
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40133789
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Не существует. В пределах официального проекта не планируется.

Как ты его себе представляешь и зачем? Просто несколько коннектов в разных
потоках не помогут?..


Видимо, речь идёт о совместимости с асинхронными конструкциями async / await некоторых современных языков программирования.
Наверняка такие библиотеки имеются. Как у них организована асинхронность обращений к FB - это другой вопрос. В простейшем случае могут создавать отдельный поток на каждое обращение к БД, чтобы не блокировать главный поток.
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40133803
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ArtDen
А если ещё и язык поддерживает асинхронные операции, то использование такого API почти ничем не отличается от использования обычного API.


Сегодня выспался и понял, что вчера ночью неправильно написал. Хотел написать "использование высокоуровневой обёртки вокруг такого API почти ничем не отличается от использования обычного высокоуровнего API"

Т.е. в итоге программист уже использует что-то вроде
Код: plaintext
1.
2.
3.
4.
db = connect(blabla).await
tr = db.create_transaction().await
st = tr.execute("select blabla").await
row = st.fetch().await
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40133807
ggreggory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ArtDen

Т.е. в итоге программист уже использует что-то вроде


а какой профит? сервер же не будет всё это делать параллельно.
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40133811
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Компилятор такие конструкции компилириует таким образом, что на при ожидании await рантайм переключит выполнение этого потока на другую задачу, которая уже завершила свою асинхронную операцию (вышла из await) и готова продолжать выполнение. Таким образом всё выполняется как-бы параллельно. В реальности используется не один поток, а больше (обычно по количеству ядер или кратно в несколько раз) и поэтому без создания 100500 потоков можно работать с большим количеством задач и соединений к базе (десятки тысяч). Подобную возможность завезли уже в кучу языков. Даже в C++ добавили в последнем стандарте.

Но это обсуждение уже выходит за рамки моего вопроса. Ответ был получен. Всем спасибо )
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40133818
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDenпри ожидании await рантайм переключит выполнение этого потока на другую задачу,
которая уже завершила свою асинхронную операцию (вышла из await) и готова
продолжать выполнение.

Какая это задача? В твоём примере таких не наблюдается, всё выполняется строго
последовательно, полностью синхронно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40133819
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я показал просто пример использования API. В реальном приложении будет что-то типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
asynch task1:
    db = connect_db(blabla).await
    tr = db.create_transaction().await
    st = tr.execute("select blabla").await
    row = st.fetch().await

asynch task2:
    db = connect_db(blabla).await
    tr = db.create_transaction().await
    st = tr.execute("select blabla").await
    row = st.fetch().await

asynch task3:
    file = open(filename).await
    file_data = file.read_all().await

asynch task4:
   socket = connect_socket(blabla).await

asynch task5:

... и так далее

Понятно что в реальности всё будет намного сложнее. Обычно создаются динамические пулы соединений и всякая другая фигня, экономящая время, но асинхронности это не отменяет.

В сети много инфы для чего нужен и как устроен этот механизм в разных языках и фреймворках
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40133820
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ещё там много котиков и предложений увеличить пенис. Толку-то?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40133821
sysdba22
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так node-firebird-driver асинхронный. работает как часы ))
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
export const loadRDBFields = async (attachment: Attachment, transaction: Transaction) => {
  const rs = await attachment.executeQuery(transaction, `
    SELECT 
      TRIM(rdb$field_name) AS rdb$field_name,
      CAST(rdb$validation_source AS VARCHAR(255)) AS rdb$validation_source,
      CAST(rdb$computed_source AS VARCHAR(255)) AS rdb$computed_source, 
      CAST(rdb$default_source AS VARCHAR(255)) AS rdb$default_source, 
      rdb$field_length,
      rdb$field_scale,
      rdb$field_type,
      rdb$field_sub_type,
      rdb$system_flag,
      rdb$null_flag,
      rdb$character_length,
      rdb$collation_id,
      rdb$character_set_id,
      rdb$field_precision
    FROM 
      rdb$fields
  `);
  try {
    return (await rs.fetchAsObject<IRDBField>()).reduce( (p, r) => (p[r.RDB$FIELD_NAME] = r, p), {} as IRDBFields);
  } finally {
    await rs.close();
  }
};
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40133822
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если он использует синхронное родное API, то он не асинхронный, а только имитирует асинхронность. В node.js без асинхронности никуда, поэтому даже имитация сойдёт.

Но у них там написано: There is also plan to create a socket-based (pure Node.js) driver.

Так что возможно что будет полноценный асинхронный драйвер для ноды

Если родное API не поддерживает асинхронность, то единственный способ сделать асинхронный клиент - это написать сетевой обмен самостоятельно.
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40133826
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDenединственный способ сделать асинхронный клиент - это написать сетевой обмен
самостоятельно.

Создателям драйверов для Явы, Питона и С-шарпа это удалось, так что и остальным
можно брать флаг в руки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40133827
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Надо будет посмотреть их реализацию. Интересно, где описание сетевого обмена брали? Смотрели в исходниках fb или где-то доки есть?
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40133828
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40133829
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.

Сразу замечание. Там не написано как числа передаются: в BE или LE?
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40133868
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну и вызывает вопросы актуальность. Например тут: https://firebirdsql.org/file/documentation/html/en/firebirddocs/wireprotocol/firebird-wire-protocol.html#wireprotocol-databases-attach-attachment
Не верится, что пароль открытым текстом по сети передаётся. Похоже лучше смотреть готовую реализацию
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40133895
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen,

это зависит от плагина аутентификации
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40133906
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже до появления SRP пароль не передавался в открытом виде - только его хеш.
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40133979
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что насчёт BE и LE? Если посмотреть сишарпоский вариант, то там байты для отправки по сети из числа типа int32 получают вот так:
Код: c#
1.
2.
3.
4.
public static byte[] EncodeInt32(int value)
{
	return BitConverter.GetBytes(IPAddress.NetworkToHostOrder(value));
}


(даже тип IPAddress для этого задействовали )) )

Я догадываюсь, то это означает BE, но хочется уточнить )
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40133982
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen
А что насчёт BE и LE?


Для локального протокола (XNET) нет преобразования.
Для удалёного (INET) - числа передаются в сетевом порядке (htonl, ntohl)

PS Смотри src\remote\protocol.cpp и src\common\xdr.cpp
там ответы на 99% вопросов о протоколе.
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40134097
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad, неподготовленному глазу проще смотреть исходники не fb, а сторонних драйверов, т.к. они заточены только под одну задачу - работа в качестве клиента fb.
Сегодня потратил полдня в попытке понять почему сервер не отвечает на даже первую посылку. Слава богу что по сниферу понял, что тип Buffer надо "добивать" в конце нулями до длины кратной 4 (( А ведь тут об этом вообще не слова. А я поленился посмотреть как это сделано в csharp-ском драйвере, на который сейчас ориентируюсь
...
Рейтинг: 0 / 0
Асинхронное API для клиента
    #40134107
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это базовая спецификация XDR.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 54, страница 1 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Асинхронное API для клиента
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (2): Анонимы (1), Yandex Bot 2 мин.
Пользователи онлайн (11): Анонимы (8), Yandex Bot, Google Bot 1 мин., Bing Bot 3 мин.
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]