【问题标题】:Multithreaded socket Program - Handling Critical section多线程套接字程序 - 处理关键部分
【发布时间】:2019-06-28 05:02:47
【问题描述】:

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

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

【问题讨论】:

  • 第二个听起来好像你让关键部分的范围太大了
  • 如果数据创建时间过长,也许你应该在进入临界区之前创建它
  • acc to geeksforgeeks.org/socket-programming-multi-threading-python这篇文章,可以使用acquire & release方式。
  • @flakes 是的,关键部分太大,但由于其他一些限制,我以后无法构建。
  • 你不能神奇地让你的代码运行得更快。您有一个需要 n 秒的关键部分,并且您每秒的请求数大于 1/n,因此您将累积积压。再多的锁定也无法解决这个问题。您需要通过缩小其范围、提高其性能或在更快的硬件上运行代码来减少完成关键部分所需的时间

标签: python python-multithreading condition-variable critical-section


【解决方案1】:

我会使用一个专门用于发送的附加线程。使用Queue 其他线程放置其发送数据的位置。套接字线程循环从队列中获取项目并一个接一个地发送。

只要队列为空,.get 就会阻塞并且发送线程休眠。

“生产者”线程根本没有等待时间,它们只是将数据放入队列中并继续。

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

要停止发送线程,请将一些特殊项目(例如无)放入队列中。

要启用返回值,请将元组 (send_data, return_queue) 放入发送队列。当结果准备好后,将其放入return_queue 中返回。

【讨论】:

  • 是的,谢谢。但是我们改变设计的工具迟到了。您能否建议从上面提供的最佳选项或任何其他适合现有设计要求和约束的方法。
  • 您有两个选择。让每个生产者线程自己发送数据,用锁保护套接字,这是您的选项#2。或者,将要发送的数据排队,并让一个额外的线程按照自己的节奏发送。这就是我的建议。正如您所提到的,您的选项 #2 会导致锁争用,这就是为什么它被认为是糟糕的设计。所以,要么改变设计,要么接受它。
猜你喜欢
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 2013-02-02
  • 2013-07-03
  • 2019-07-29
  • 1970-01-01
相关资源
最近更新 更多