Многопоточная программа сокетов - секция обработки критических - PullRequest
1 голос
/ 28 июня 2019

Я создаю многопоточную программу, в которой я хочу, чтобы только один поток за раз шел в критическую секцию, где создается сокет и отправлял некоторые данные, а все остальные ожидали очистки этой переменной.

  1. Я пробовал создавать потоки. События, но позже понял, что при использовании set () он уведомит все ожидающие потоки.Пока я только хотел уведомить одного.
  2. Пробовал замки (приобретать и отпускать).Это хорошо подходило для моего сценария, но я узнал, что длительная борьба за блокировку обходится дорого.После получения блокировки мой поток выполнял много функций и, как следствие, долго удерживал блокировку.
  3. Теперь я попробовал threading.conditions.Я просто хотел узнать, долго ли приобретается и удерживается условие, не является ли это хорошей практикой, поскольку он также использует блокировки.Может кто-нибудь предложить лучший подход к моей постановке проблемы.

1 Ответ

1 голос
/ 28 июня 2019

Я бы использовал дополнительный поток, посвященный отправке.Используйте Queue , где другие потоки помещают свои Send-Data.Поток сокетов получает элементы из очереди в цикле и отправляет их один за другим.

Пока очередь пуста, .get блокируется, а поток отправки спит.

У потоков-производителей вообще нет времени ожидания, они просто помещают свои данные в очередь и продолжают работу.

Нет проблем с возможными условиями взаимоблокировки.

Для остановки отправки-поток, поместите некоторый специальный элемент (например, Нет) в очередь.

Чтобы включить возврат значений, поместите кортеж (send_data, return_queue) в очередь отправки.когда результат будет готов, верните его, поместив в return_queue.

...