多线程socket程序——临界区处理

Multithreaded socket Program - Handling Critical section

我正在创建一个多线程程序,其中我一次只希望 1 个线程进入关键部分,在关键部分创建一个套接字并发送一些数据,所有其他线程等待该变量清除.

  1. 我试过 threading.Events 但后来意识到在 set() 上它会通知所有等待的线程。虽然我只想通知一个。
  2. 已尝试锁定(获取和释放)。它很适合我的场景,但我知道长时间的锁争用是昂贵的。获得锁后,我的线程正在执行许多功能,因此导致长时间持有锁。
  3. 现在我尝试了 threading.conditions。只是想知道是否长时间获取和持有条件,这不是一个好习惯,因为它也使用锁。 谁能对我的问题陈述提出更好的方法。

我会使用一个专用于发送的附加线程。在其他线程放置它们的 Send-Data 的地方使用 Queue。 socket-thread 在循环中从队列中获取项目并一个接一个地发送。

只要队列为空,.get 就会阻塞,send-thread 就会休眠。

"producer" 个线程根本没有等待时间,它们只是将数据放入队列中并继续。

无需担心可能出现的死锁情况。

要停止 send-thread,请将一些特殊项目(例如 None)放入队列中。

要启用 returning 值,请在 send-queue 中放置一个元组 (send_data, return_queue)。当结果准备好后,return 将其放入 return_queue.