Pull to refresh
3
1
Subscribers
Send message

Хотелось написать, что run_in_executor, вызываемый to_thread, создает новый поток (thread) при каждом вызове, на основании того, что создается новый ThreadPoolExecutor, но тесты показывают обратное: при множестве вызовов to_thread ID потока (thread) ОС часто одинаковый:

def save_thread_id(test: str, path: str) -> None:
    with open(path, 'a') as fh:
        fh.write(f'\n{test}: {threading.get_native_id()}')
    # It does not change the test results on my machine
    time.sleep(1)


async def test_asyncio_to_thread():
    path = 'asyncio_thread_test.txt'
    try:
        os.remove(path)
    except FileNotFoundError:
        pass

    with open(path, 'a') as fh:
        fh.write(f'main: {threading.get_native_id()}')

    with ThreadPoolExecutor(max_workers=1) as pe:
        pe.submit(save_thread_id, 'test1', path)
        pe.submit(save_thread_id, 'test1', path)
        pe.submit(save_thread_id, 'test1', path)

    for _ in range(20):
        await asyncio.to_thread(save_thread_id, 'test2', path)


if __name__ == '__main__':
    asyncio.run(test_asyncio_to_thread())

cat asyncio_thread_test.txt

main: 316512
test1: 316513
test1: 316513
test1: 316513
test2: 316517
test2: 316517
test2: 316517
...
test2: 316517


Более подробный ответ на первый вопрос: Если есть несколько репозиториев под контролем версий с приложениями в контейнерах, которые не настроены на выход в сеть через тоннель, но для разработки их нужно запускать с выходом в сеть через тоннель или напрямую, не меняя файлы под контролем версий (docker-compose.yml, Dockerfile), держать настройки запуска через тоннель в том же репозитории, но не под контролем версий и удобно запускать приложения.

С подходом с Wireguard в отдельном контейнере нужно добавить в каждый репозиторий docker-compose.override.yml файл с network_mode: 'container:vpn' и networks: - vpn и запускать как обычно.

Нафига?

Нужно было решить такую задачу.

Нафига на Хабре?

network_mode: "container:IDorName" считаю малоизвестной функцией. Если бы такая статья была на Хабре, то я бы сэкономил время.

Может кто-нибудь скажет мне в комментариях, что есть решение еще лучше или укажет на ошибки.

Да, в оригинале while (!__comp(*--__j, *__m));

while (!__comp(*–__j, *__m));

Это опечатка? Должно быть --__j ?

Команды docker init нет в официальной документации, может вы имели ввиду docker swarm init?

В коде примеров автора проекта данные считываются понемногу:

while True:
    data = wf.readframes(4000)
    if len(data) == 0:
        break
    if rec.AcceptWaveform(data):
        print(rec.Result())
    else:
        print(rec.PartialResult())


В серверной реализации тоже.

В Telegram канале по распознаванию речи высказывали мнение, что не нужно подавать больше секунды звука за раз, однако, мне неизвестно четкое объяснение почему именно так.

Не удалось найти в документации описание метода AcceptWaveform, но для себя имею такое пояснение: «AcceptWaveform возвращает true, когда обнаружена тишина и данные могут быть получены через метод Result. Если тишина не обнаружена, частичные данные можно получить через метод PartialResult. Вызов метода FinalResult сбрасывает внутреннее состояние объекта и возвращает оставшийся результат».

Вызов FinalResult вместо Result, если AcceptWaveform вернул положительный результат иногда помогает получить более точное распознавание, если, например, за громкой длинной фразой следует короткая тихая фраза. В таких случаях Result может вернуть только первую фразу, даже если между двумя фразами и после последней фразы есть тишина.

Information

Rating
Does not participate
Registered
Activity