Я бы использовал дополнительный поток, посвященный отправке.Используйте Queue , где другие потоки помещают свои Send-Data.Поток сокетов получает элементы из очереди в цикле и отправляет их один за другим.
Пока очередь пуста, .get
блокируется, а поток отправки спит.
У потоков-производителей вообще нет времени ожидания, они просто помещают свои данные в очередь и продолжают работу.
Нет проблем с возможными условиями взаимоблокировки.
Для остановки отправки-поток, поместите некоторый специальный элемент (например, Нет) в очередь.
Чтобы включить возврат значений, поместите кортеж (send_data, return_queue)
в очередь отправки.когда результат будет готов, верните его, поместив в return_queue
.