Python Threading.Event半忙等待的更好解决方案

2024-01-11

我正在使用非常标准的 Threading.Event: 主线程到达一个运行循环的点:

event.wait(60)

另一个阻塞请求,直到有可用答复为止,然后启动:

event.set()

我希望主线程选择 40 秒,但事实并非如此。 来自 Python 2.7 源 Lib/threading.py:

# Balancing act:  We can't afford a pure busy loop, so we
# have to sleep; but if we sleep the whole timeout time,
# we'll be unresponsive.  The scheme here sleeps very
# little at first, longer as time goes on, but never longer
# than 20 times per second (or the timeout time remaining).
endtime = _time() + timeout
delay = 0.0005 # 500 us -> initial delay of 1 ms
while True:
   gotit = waiter.acquire(0)
   if gotit:
       break
   remaining = endtime - _time()
   if remaining <= 0:
       break
   delay = min(delay * 2, remaining, .05)
   _sleep(delay)

我们得到的是每 500us 运行一次的选择系统调用。 这会导致机器上出现明显的负载,并且选择循环非常紧密。

有人可以解释一下为什么涉及平衡行为以及为什么它与等待文件描述符的线程不同。

其次,是否有更好的方法来实现一个大部分睡眠的主线程而不需要如此紧密的循环?


我最近遇到了同样的问题,我还追踪到了这个确切的代码块threading module.

太糟糕了。

解决方案是使线程模块过载,或者迁移到python3,这部分实现已得到修复。

就我而言,迁移到 python3 需要付出巨大的努力,所以我选择了前者。我所做的是:

  1. 我创建了一个快速.so文件(使用cython)有一个接口pthread。它包括调用相应的Python函数pthread_mutex_*功能和链接libpthread。具体来说,与我们感兴趣的任务最相关的函数是pthread_mutex_timedlock http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_mutex_timedlock.html.
  2. 我创建了一个新的threading2模块,(并替换所有import threading我的代码库中的行import threading2). In threading2,我重新定义了所有相关的类threading (Lock, Condition, Event),还有来自Queue我经常使用它(Queue and PriorityQueue). The Lock类完全重新实现使用pthread_mutex_*函数,但其​​余的要容易得多——我只是对原始函数进行了子类化(例如threading.Event),并覆盖__init__创造我的新Lock类型。剩下的就工作了。

新政的实施Lock类型与原始实现非常相似threading,但我基于新的实现acquire在我找到的代码上python3's threading模块(当然,它比上述“平衡行为”块简单得多)。这部分相当简单。

(顺便说一句,我的例子的结果是我的大规模多线程进程加速了 30%。甚至超出了我的预期。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python Threading.Event半忙等待的更好解决方案 的相关文章

随机推荐

  • Chrome 扩展 - 获取当前选项卡的全部文本内容

    我正在开发一个扩展 我需要获取当前选项卡上的整个文本内容 现在我有一个插件可以从当前选项卡中检索选定的文本 所以 本质上我正在寻找它的 ctrl A 版本 这就是我到目前为止根据 Derek 的提示所做的事情 这是在我的事件处理程序中 这只
  • 当 python2.7 运行良好时,python 3.3 出现缩进错误

    我在下面编写了这个脚本 它将数字转换为其拼写 no raw input Enter a number strcheck str no try val int no except ValueError print sayi degil rai
  • Visual Studio 2010 中的 global.asax.cs 在哪里

    我安装的模板中不再有全局应用程序类代码隐藏 我只有 Global asax 我发现与全局 asax cs 为什么我再也看不到它了 如何重新创建Global asax cs 这是因为您创建的是网站而不是 Web 应用程序 我建议您使用预编译的
  • Kotlin 脚本文件中仅部分语法突出显示

    我在 Android Studio 中打开了一个文件夹 其中包含一个 Kotlin 脚本文件 kts 我在项目结构中配置了 JDK 作为 SDK 但我没有添加 gradle 文件 并且作为 Kotlin 脚本运行该文件工作正常 然而 语法突
  • PHP:尝试让 fgets() 在 CRLF、CR 和 LF 上触发

    我正在使用 proc open 和 fgets stdout 读取 PHP 中的流 尝试获取传入的每一行 许多 Linux 程序 包管理器 wget rsync 仅使用 CR 回车 字符来表示定期 就地 更新的行 例如下载进度 我希望在这些
  • MVC ValidateAntiForgeryToken 多选项卡问题

    我们收到 未提供所需的防伪令牌或该令牌无效 的信息 错误 并且经过一些进一步的调查 我成功地以最简单的形式重新创建了问题 我要么做了完全错误的事情 要么这是防伪令牌系统的限制 不管怎样 我会很感激一些建议 空 MVC 2 项目 一个视图页面
  • 如何在 gemspec 中指定最低 Ruby 版本?

    我正在为新版本的 gem 编写 gemspec 现在需要 Ruby 1 9 以前版本的 gem 可以在 Ruby 1 8 上使用 但现在需要 1 9 有没有办法让这个版本的 gem 安装失败 并为尝试在 Ruby 1 8 上安装它的用户发出
  • /dev/mem 和 /dev/kmem 不存在?

    如果有人能解释一下为什么这两个文件不存在 我将不胜感激 如果没有这两个文件 Android内核的虚拟内存空间和物理空间会是什么样子 Edit I am having Android 2 3 7 Cyanogen mod the 2 file
  • 如何复制整个目录结构?

    我正在将 10 000 个文件从一个目录复制到另一个目录 两个目录结构都有相同的文件 但是 尺寸可能会有所不同 如何强制覆盖不同大小的文件而不复制相同大小的文件 到目前为止我有这个 source D Test1 destination D
  • 是否可以在 Hibernate / JPA 中动态定义列名?

    因此 我有一个现有的数据库模式 其中包含许多我想使用 JPA Hibernate 进行建模的表 每个 表具有同一组 30 个附加列 以允许运行时扩展字段数量 记录 CREATE TABLE XX ID VARCHAR2 100 BYTE N
  • 使用 ui-router 时控制器可以从父控制器继承范围吗

    我有以下内容 var admin name admin url admin views nav sub templateUrl Content app admin partials nav sub html controller funct
  • 如果一个表单字段有多个验证器,如何让play一一验证它们,而不是全部验证?

    我看到了一个登录表单 有一个name输入有许多验证器 object Users extends Controller val loginForm Form tuple name gt nonEmptyText 1 verifying Its
  • 是否可以查看对 Firebase 数据库所做的更改日志?

    我的一个 Firebase 对象被删除了 我试图弄清楚这种情况是什么时候发生的 Firebase 是否有日志显示更改发生的时间 有些人说这存在于 Analytics 中 但我无法找到它 提前致谢 火力战士在这里 没有可公开访问的日志来记录对
  • C ++ 提升绑定性能

    绑定函数 使用 Boost Bind 时是否会对性能产生任何影响 正面或负面 也许 也许不是 这取决于 的结果std bind 或者也boost bind 是所谓的 绑定表达式 它具有由实现确定的不可知类型 这种类型是一个Callable
  • 将一些 WooCommerce 产品数据传递到 Contact Form 7 查询表

    After 当 WooCommerce 中所选变体缺货时显示表单 https stackoverflow com questions 66405033 display a form when the selected variation i
  • 使用来自 URL 的 HTML 中的 .svg 文件?

    我正在尝试在我的 html 中使用来自外部源的 svg 假设我有这个 svg https upload wikimedia org wikipedia commons 0 09 America Online logo svg https u
  • 功能组件嵌套与 props

    我对 React 还很陌生 我有一个关于架构和设计模式的问题 我已经完成了我的第一个项目 交互式图灵机测序仪 http reactiveturing herokuapp com 如果有人感兴趣的话 我发现自己经常声明嵌套函数 例如 func
  • 如何验证Fragments中的EditText并防止Fragment更改?

    说明 我有一个片段活动FirstRun其中包括 5碎片 with 滑动导航 第二个和第三个片段包含 2编辑文本需要用户填写 并且不需要为空或未填写 好的 我可以使用 OnTextChanged 侦听器验证字段 但用户有可能只是滑到下一个片段
  • 选择项目时 onNavigationItemSelected 不调用

    我使用以下代码在导航抽屉中添加页脚视图
  • Python Threading.Event半忙等待的更好解决方案

    我正在使用非常标准的 Threading Event 主线程到达一个运行循环的点 event wait 60 另一个阻塞请求 直到有可用答复为止 然后启动 event set 我希望主线程选择 40 秒 但事实并非如此 来自 Python