Условие гонки между ThreadPoolExecutor и подпроцессом, использующим сеть

#python #windows #concurrency #race-condition

Вопрос:

У меня есть скрипт, состоящий из 2 процессов для загрузки и фильтрации/сохранения ответов:

  • Процесс A: использует ThreadPoolExecutor с 4 потоками для загрузки более 100 МБ файлов
  • Процесс B: сидит в a while и взаимодействует с процессом A через очередь

Проблема, с которой я сталкиваюсь, заключается в том, что, как только процесс B удаляет элемент из очереди, он начинает фильтровать ответы фиксированной ширины и записывать в файл, но прежде чем он сможет записать в файл, процесс A берет управление на себя. Что я имею в виду под «берет под контроль»? Ну, местоположение, в которое процесс B записывает ответы, находится на сетевом диске, который находится в том же сетевом канале, что и загрузка, происходящая в процессе A; что еще хуже, пропускная способность ограничена 100 Мбит / с (не Мбит / с).

Конечным результатом является то, что процесс А, похоже, получает «сетевой приоритет», когда один из потоков исполнителя начинает получать ответы (рассматриваемая веб-служба не разрешает потоковую передачу ответов, поэтому требуется загрузка).

Можно ли предотвратить это при загрузке и записи в файл по одной и той же сети, не возвращаясь к синхронной обработке?