Я предполагаю, что вы написали модуль Python C, который предоставляет функцию ReadUSBDevice и что он предназначен для блокировки до получения USB-пакета, а затем возвращает его.
Собственная реализация ReadUSBDevice должна выпустить Python GIL, пока он ожидает пакет USB, а затем повторно получить его, когда он получит его. Это позволяет другим потокам Python работать во время выполнения собственного кода.
http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock
Пока вы разблокировали GIL, вы не можете получить доступ к Python. Отпустите GIL, запустите функцию блокировки, затем, когда вы узнаете, что у вас есть что-то, чтобы вернуться обратно в Python, повторно запустите его.
Если вы этого не сделаете, никакие другие потоки Python не смогут выполняться, пока идет ваша собственная блокировка. Если это модуль Python, поставляемый поставщиком, сбой при освобождении GIL во время действий по собственной блокировке является ошибкой.
Обратите внимание, что если вы получаете много пакетов и фактически обрабатываете их в Python, другие потоки все равно должны работать. Несколько потоков, которые на самом деле выполняют код Python, не будут работать параллельно, но они часто будут переключаться между потоками, давая им всем шанс на запуск. Это не работает, если собственный код блокируется без освобождения GIL.
edit: я вижу, вы упомянули, что это библиотека, поставляемая поставщиком. Если у вас нет источника, быстрый способ узнать, выпускают ли они GIL: запустите поток ReadUSBDevice, пока не происходит никаких действий с USB, поэтому ReadUSBDevice просто сидит и ждет данных. Если они выпускают GIL, другие потоки должны работать беспрепятственно. Если это не так, он заблокирует весь переводчик. Это было бы серьезной ошибкой.