Если вы не изменяете список вне контекста обратного вызова, то вам не обязательно нужна синхронизация - вам просто нужно знать, что состояние объекта списка является изменчивым.
Если список необходимо изменить как в обработчике обратного вызова, так и, скажем, в главном контексте выполнения (или других потоках и т. Д.), Тогда да, вам потребуется синхронизация.
Python synchronized Queue
работает естественным образом для насосов сообщений - позволяя вам выполнять действия последовательно в том порядке, в котором события происходят в одном из ваших собственных контекстов. Это также способствует простоте кода и удобочитаемости, поскольку основные изменения состояния легче отслеживать. Как правило, обратные вызовы не должны быть слишком сложными, поскольку внешний контекст, в котором вызываются обратные вызовы, не должен (и, вероятно, не должен) иметь дело с исключениями, возникающими из вашего кода. Также есть потенциальные временные соображения - обратный вызов блокирует контекст асинхронного излучателя - поэтому держать обработчик коротким и приятным тоже хорошо.