多线程socket程序——临界区处理
Multithreaded socket Program - Handling Critical section
我正在创建一个多线程程序,其中我一次只希望 1 个线程进入关键部分,在关键部分创建一个套接字并发送一些数据,所有其他线程等待该变量清除.
- 我试过 threading.Events 但后来意识到在 set() 上它会通知所有等待的线程。虽然我只想通知一个。
- 已尝试锁定(获取和释放)。它很适合我的场景,但我知道长时间的锁争用是昂贵的。获得锁后,我的线程正在执行许多功能,因此导致长时间持有锁。
- 现在我尝试了 threading.conditions。只是想知道是否长时间获取和持有条件,这不是一个好习惯,因为它也使用锁。
谁能对我的问题陈述提出更好的方法。
我会使用一个专用于发送的附加线程。在其他线程放置它们的 Send-Data 的地方使用 Queue。 socket-thread 在循环中从队列中获取项目并一个接一个地发送。
只要队列为空,.get
就会阻塞,send-thread 就会休眠。
"producer" 个线程根本没有等待时间,它们只是将数据放入队列中并继续。
无需担心可能出现的死锁情况。
要停止 send-thread,请将一些特殊项目(例如 None)放入队列中。
要启用 returning 值,请在 send-queue 中放置一个元组 (send_data, return_queue)
。当结果准备好后,return 将其放入 return_queue
.
我正在创建一个多线程程序,其中我一次只希望 1 个线程进入关键部分,在关键部分创建一个套接字并发送一些数据,所有其他线程等待该变量清除.
- 我试过 threading.Events 但后来意识到在 set() 上它会通知所有等待的线程。虽然我只想通知一个。
- 已尝试锁定(获取和释放)。它很适合我的场景,但我知道长时间的锁争用是昂贵的。获得锁后,我的线程正在执行许多功能,因此导致长时间持有锁。
- 现在我尝试了 threading.conditions。只是想知道是否长时间获取和持有条件,这不是一个好习惯,因为它也使用锁。 谁能对我的问题陈述提出更好的方法。
我会使用一个专用于发送的附加线程。在其他线程放置它们的 Send-Data 的地方使用 Queue。 socket-thread 在循环中从队列中获取项目并一个接一个地发送。
只要队列为空,.get
就会阻塞,send-thread 就会休眠。
"producer" 个线程根本没有等待时间,它们只是将数据放入队列中并继续。
无需担心可能出现的死锁情况。
要停止 send-thread,请将一些特殊项目(例如 None)放入队列中。
要启用 returning 值,请在 send-queue 中放置一个元组 (send_data, return_queue)
。当结果准备好后,return 将其放入 return_queue
.