【问题标题】:libgcc_s.so.1 must be installed for pthread_cancel to work必须安装 libgcc_s.so.1 才能使 pthread_cancel 工作
【发布时间】:2021-02-24 02:23:02
【问题描述】:

我在 python 上;我正在尝试关闭通过 ThreadPoolExecutor 运行的函数,但关闭时因错误而崩溃:

libgcc_s.so.1 must be installed for pthread_cancel to work

函数提交:

record_future = self.executor.submit(next,primitive)

primitive 是一个迭代器,通常会返回一个值,但在某些情况下,它需要等待一段时间才能返回一个值(因为计算时间长等)。在这些情况下,当我需要关闭正在运行的线程时,我不能等待迭代器完成返回,需要立即关闭它。我做到了:

executor.shutdown(wait=False)

但是,当执行到这一点时,我得到了 libgcc 错误。

我尝试通过手动安装来“解决”它:

apt-get install libgcc1:amd64

但没有骰子。我不确定python到底在哪里寻找这个库,否则我会尝试创建一个符号链接,因为该库已经安装在:

$ /sbin/ldconfig -p | grep libgcc
libgcc_s.so.1 (libc6,x32) => /usr/libx32/libgcc_s.so.1
libgcc_s.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libgcc_s.so.1
libgcc_s.so.1 (libc6) => /usr/lib32/libgcc_s.so.1

【问题讨论】:

    标签: python threadpool threadpoolexecutor


    【解决方案1】:

    您使用的是 Python 3.7 还是 3.8?

    使用我的 Anaconda Python 3.8 在 Python 的 sounddevice 中也遇到此错误,但使用我的 Anaconda Python 3.7 时不会发生此错误。我已经在谷歌搜索中测试了所有的解决方法,并确保所有相关的包和库都是相同的版本,它仍然不起作用。我的最后一个猜想是 Python 3.8 和 3.7 的版本差异。虽然可能不是这样^_^

    【讨论】:

    • 我在 Python 3.8.0 中使用 tqdm 包时遇到了同样的错误。 Python 3.6.9 也不会发生这种情况。我没有任何想法,但我找到了bugs.ams1.psf.io/issue42888
    • 我已经仔细检查过,我很确定 libgcc_s.so.1 已安装并可访问。似乎是 Python 3.8 的延迟加载动态库特性导致它出现在多个包中。
    【解决方案2】:

    我在Python mailing list 中发现了一种潜在的解决方法,即通过ctypes 显式加载libgcc_.so.1,如下所示:

    import ctypes
    libgcc_s = ctypes.CDLL('libgcc_s.so.1')
    

    必须确保在创建任何线程之前加载它,并且变量libgcc_s 一直持续到所有线程都关闭(即将它放在文件的开头)。

    【讨论】:

    • 我试过这个方法,但我现在得到以下信息:` OSError: /mnt/d/Projects/EBKA/edna_env/lib/python3.7/site-packages/mysql/vendor/libssl. so.1.1:符号 EVP_idea_cbc 版本 OPENSSL_1_1_0 未在文件 libcrypto.so.1.1 中定义,链接时间参考 `
    • 我有 python 多线程的 libgcc_s.so.1 问题。首先,我在使用这个解决方案时遇到了 OSError,就像 @asuprem 一样。然后,在任何导入解决它之前将解决方案放在我的代码顶部
    猜你喜欢
    • 2011-11-06
    • 2017-03-03
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2021-09-08
    • 1970-01-01
    相关资源
    最近更新 更多