Редактировать - Вычеркнул предложение прослушать / принять, спасибо Дэниел, я только что пришел, чтобы удалить его, когда увидел твой комментарий:)
Я бы предположил, что это проблема сетевого программирования, а не python как таковая.
Вы установили частоту пакетов в секунду и продолжительность, чтобы определить количество вызовов recv, которые вы делаете на свой сокет UDP. Я не вижу вызовов listen
или accept
в сокет, я предполагаю, что recv
обрабатывает, как вы говорите, вы получаете некоторые данные . Вы не упомянули генерацию данных.
Вы определили, сколько операций чтения вы ожидаете сделать, поэтому я предполагаю, что код делает столько же запросов до выхода, поэтому я пришел к выводу, что ваш recv packetSize
недостаточен, и поэтому одно чтение не не тянет всю дейтаграмму, затем последующее recv вытягивает следующую часть предыдущей дейтаграммы.
Разве вы не можете посмотреть на полученные данные и определить, чего не хватает? Какие данные вы «теряете»? Откуда ты знаешь, что он потерян?
Кроме того, вы можете использовать wireshark
, чтобы убедиться, что ваш хост фактически получает данные одновременно с проверкой размера дейтаграмм. Сопоставьте перехват с данными, которые предоставляет ваш поток recv.
Update
Вы говорите, что теряете данные, но не то, что это. Я вижу две возможности потери данных:
- Усечение пакетов
- Отбрасывание пакетов
Вы сказали, что размер полезной нагрузки совпадает с размером, который вы передаете в recv
, поэтому я буду считать, что вы не усекаете.
Таким образом, факторы для отбрасывания пакетов - это комбинация скорости приема, скорости чтения из буфера приема и размера буфера приема.
Ваши звонки на Queue.put
могут замедлять скорость чтения.
Итак, сначала определите, что вы можете читать 1200 пакетов в секунду, изменив readFromUDPSocket
на Queue.put
, но не подсчитав количество полученных и полученных отчетов.
Как только вы определили, что можете позвонить recv
достаточно быстро, следующим шагом будет выяснение того, что вас тормозит. Я подозреваю, что это может быть использование вами Queue
, я предлагаю группировать полезные нагрузки в группах размера N для размещения на Queue
, чтобы вы не пытались вызвать put
на 12 Гц.
Учитывая, что вы хотите поддерживать скорость 1200 операций чтения в секунду, я не думаю, что вы сильно продвинетесь, увеличив приемный буфер на сокете.