Python 中的错误? threading.Thread.start() 并不总是返回

2024-05-15

我有一个很小的 ​​Python 脚本(在我看来)threading.Thread.start()表现出意外,因为它不会立即返回。

在线程内我想调用一个方法boost::python基于对象,不会立即返回。

为此,我将对象/方法包装如下:

import threading
import time
import my_boostpython_lib

my_cpp_object = my_boostpython_lib.my_cpp_class()

def some_fn():
    # has to be here - otherwise .start() does not return
    # time.sleep(1)  
    my_cpp_object.non_terminating_fn() # blocks

print("%x: 1" % threading.get_ident())
threading.Thread(target=some_fn).start()
print("%x: 2" % threading.get_ident())  # will not always be called!!

只要我一切正常之前运行一些代码 my_cpp_object.non_terminating_fn()。如果我不这样做,.start()将以与调用相同的方式阻塞.run()直接会。

在调用之前只打印一行boost::python功能还不够,但是例如打印两行或调用time.sleep() makes start()如预期立即返回。

你能解释一下这种行为吗?我该如何避免这种情况(除了打电话sleep()在致电之前boost::python功能)?


这种行为(就像在大多数情况下,当你相信解释器/编译器中存在错误时)不是 Python 中的错误,而是竞争条件涵盖了 Python 所带来的预期行为GIL(还讨论了here https://stackoverflow.com/questions/22138190/python-threading-thread-start-doesnt-return-control-to-main-thread).

一旦非Python函数my_cpp_object.non_terminating_fn()启动后,GIL 在返回之前不会被释放,并阻止解释器执行任何其他命令。

So time.sleep(1)无论如何这里没有帮助,因为下面的代码my_cpp_object.non_terminating_fn()在 GIL 被释放之前不会被执行。

的情况下boost::python当然,如果您可以修改 C/C++ 部分,您可以按照所述手动释放 GILhere https://wiki.python.org/moin/boost.python/HowTo.

一个小例子(来自上面的链接)可能看起来像这样(在 boost::python 包装器代码中)

class scoped_gil_release {
public:
    inline scoped_gil_release() {
        m_thread_state = PyEval_SaveThread();
    }

    inline ~scoped_gil_release() {
        PyEval_RestoreThread(m_thread_state);
        m_thread_state = NULL;
    }

private:
    PyThreadState * m_thread_state;
};

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

Python 中的错误? threading.Thread.start() 并不总是返回 的相关文章

随机推荐

  • 如何在 Google 地图 InfoWindow 中使用 Jquery?

    我想在 Google 地图 InfoWindow 中显示 jQuery 效果 显示和隐藏 div 我该怎么做 尽管我个人还没有尝试过 但这 gt http code google com p jquery ui map http code
  • Facebook SDK 登录/注销 ngrok

    我正在尝试将我正在构建的网络应用程序与 Facebook 集成 Facebook 现在要求所有 API 调用都必须从 https 站点进行 我正在构建的这个应用程序只是为了好玩 所以我使用的是 localhost 我在用着ngrok将我的请
  • 解决方案文件的修改权限

    我有用VS2005开发的项目解决方案 它绑定到 TFS Team Foundation Server 我想将解决方案转换为 VS2008 版本 保持绑定不变 但是在转换时出现错误 错误信息 解决方案文件 C abc abc sln 无法转换
  • Android Studio 模拟器未找到符号:_pwritev

    上次更新 Android 模拟器后 我无法启动任何虚拟设备 即使我创建了一个新的 模拟器显示几秒钟 然后出现错误 并且 macOS 在问题报告中显示 qemu system x86 64 意外退出 Dyld Error Message Sy
  • 带点 (.) 的 Spring MVC @PathVariable 被截断

    这是问题的延续Spring MVC PathVariable 被截断 https stackoverflow com questions 3526523 spring mvc pathvariable getting truncated S
  • IE 10 Javascript 错误未显示[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我刚刚将浏览器IE8升级到IE10 在 IE8 中任何java script发生错误 它显示在状态栏中 但是IE10错误未显示在状态栏中
  • 使用 Qt 上的看门狗更改 QLabel 文本

    我正在尝试做什么 每当在受监视的文件夹中创建新文件 使用 Watchdog 时 更改 QLabel 文本 Problem 使用以下代码创建新文件时 QLabel 文本不会更新 但成功调试打印到控制台 class MainWindow QtW
  • 如何在 Ionic 3 中调整图像大小而不降低质量和目标宽度和高度?

    我想减小相机 API 拍摄的图像的大小 但质量降低不好 最好的办法是降低分辨率 但我不想对所有图像使用目标宽度和高度 例如 我希望图像宽度为 1280 图像高度按其比例自动变化 但在 API 中我应该使用精确的宽度和高度 如何通过图像比例更
  • windows关闭tomcat后保持端口锁定

    我遇到了一个问题 该问题发生在不同站点的 3 台不同服务器上 问题是 当我关闭 Windows 服务器上的 Tomcat 7 和 8 5 版本 服务并尝试重新启动该服务后 该服务将无法启动 因为 tomcat 认为端口仍在使用中 以下是错误
  • 从 Ruby 中的 DateTime 变量获取时间

    我在 ruby 中工作 我有一个包含数据库中今天的日期时间的对象 我只想要时间截断数据 我怎样才能得到那个 Try 日期时间 strftime http www ruby doc org stdlib 1 9 3 libdoc date r
  • 为什么 System.Math 有 Sin、Cos 等外部方法?

    MethodImpl MethodImplOptions InternalCall public static extern double Sin double a 其原因何在 MethodImplOptions InternalCall表
  • 必填字段验证器中的数字验证

    是否可以将数字验证放入 asp net 文本框中的必填字段验证器中 您应该使用比较验证器 http msdn microsoft com en us library system web ui webcontrols comparevali
  • 自动过滤/排序列表框项目 (Windows Phone)

    我想确保添加到列表框中的项目根据每个项目的序列号按升序排序 例如 1 项目 2 项目 4 项目 3 项目应根据其编号自动排序 1 2 3 10 这是 C 源代码 namespace XeroQuiz public partial class
  • 如何使用 webpack 正确捆绑 vscode 扩展

    我遇到的问题是当我跑步时vsce package我仍然明白This extension consists of 3587 separate files For performance reasons you should bundle yo
  • 调试器异常错误和内存超调

    我尝试运行以下代码 但它显示有关内存地址的错误 并显示一条消息 循环后 n 可能未定义 请看一看 var n max integer n integer r R1 f h0 Array of Real const h 0 00889 nip
  • 使用 mosca MQTT 的请求响应模式

    有没有办法使用 mosca MQTT 实现请求响应模式 以 检查客户端的回复 如果在预期时间内未收到预期回复 则重新发布 我相信这在 Mqtt 5 中是可能的 但截至目前 我必须使用 QoS 1 的 Mosca 代理 支持直到 Mqtt 3
  • 错误 11 秒后等待 Protractor 与页面同步超时

    我的量角器测试有问题 我的角度应用程序使用 timeout 不断从服务器轮询某些内容 不幸的是 当我运行测试时 这会导致以下错误消息 There was a webdriver error Error Timed out waiting f
  • Javascript 放大/缩小到鼠标 x/y 坐标

    我设法让鼠标拖动来滚动div 但是用鼠标放大 缩小不完整 它有效 但我希望鼠标指针将图像保持在该位置并同时缩放它 如下所示 我需要使用scrollBy 将滚动返回到缩放之前的上一点 有人知道该怎么做吗 这是某人制作的小提琴https jsf
  • 如何在 Android 中启用高速蓝牙(3.0+HS 或 4.0)?

    所以我在两部蓝牙 4 0 Android 手机上有一个 BT 客户端和一个服务器应用程序 服务器等待连接通过 BluetoothServerSocket serverSocket mBluetoothAdapter listenUsingR
  • Python 中的错误? threading.Thread.start() 并不总是返回

    我有一个很小的 Python 脚本 在我看来 threading Thread start 表现出意外 因为它不会立即返回 在线程内我想调用一个方法boost python基于对象 不会立即返回 为此 我将对象 方法包装如下 import