Python 多线程在 MacOS Monterey/Apple Silicon 上不起作用

Posted

技术标签:

【中文标题】Python 多线程在 MacOS Monterey/Apple Silicon 上不起作用【英文标题】:Python multithreading didn't work at MacOS Monterey/Apple Silicon 【发布时间】:2021-12-14 04:36:10 【问题描述】:

我有一个使用 concurrent.futures 模块运行多线程的 python 3.8 脚本,并且在 MacOS Catalina (Intel) 中运行良好。迁移到 MacOS Monterey(Apple Silicon)之后。由于使用单线程,python 代码运行了很长时间。我正在使用带有 x86_64 并在 Rosetta 2 下运行的 Anaconda 附带的 python。尝试了 python 3.9(来自 Anaconda)并得到了相同的结果。如果有人可以提供解决方案或解决方法,我将不胜感激。谢谢。

这是显示问题的测试代码。在旧机器上,它运行 2 轮并在 10 秒内完成。新机运行10轮,50秒完成。

import concurrent.futures
import time


pstart = time.time()
tasks = list(range(1,11))

def sleep_5s(task):
    time.sleep(5)
    print(f'Task task start at: time.time()')


def sleep_together(tasks):
    with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
        for i,task in zip(tasks, executor.map(sleep_5s, tasks)):
            pass


sleep_together(tasks)

print('Total run time', time.time()-pstart, 'seconds.')

更新:

我找到了根本原因。我没插电源。当显示器休眠或屏幕保护程序启动时,wifi 将在 5 分钟后断开连接。这是 MacOS 的新电源调优。这是解决方案。

https://www.techrepublic.com/article/change-your-macos-power-settings-to-prevent-disconnecting-from-***wi-fi-when-the-computer-is-locked/

【问题讨论】:

当你说“Python 3.9”时,你是指通过 Rosetta 还是原生 Python? 我用conda用python 3.9(Rosetta)创建了另外一个环境来测试是否和python 3.8相关。我更改为完整的测试代码,以便您在拥有 Apple Silicon/Monterey 机器时进行测试。非常感谢。 【参考方案1】:

您的代码在 macOS Big Sur 上按预期运行,它已经是 Apple Silicon,使用本机 Python 3.9。

看起来罪魁祸首是 Rosetta 或 Monterey,而不是您的代码,但在 Rosetta 上使用 Swift 时,我确实看到了一些奇怪的错误。你考虑过这样看吗?

【讨论】:

今晚我将使用原生 Python 3.9 进行测试,稍后再更新。非常感谢。 经过进一步调查,发现多线程工作正常,但一些多线程代码被冻结。似乎多线程循环死锁了。我不知道它与 yfinance 模块(用于下载股票信息)有关。但是改成原生 Python 3.9 后问题就解决了。从 Anaconda 更改为 minforge。非常感谢。

以上是关于Python 多线程在 MacOS Monterey/Apple Silicon 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

MacOS 和 Windows 上的 Python 多处理行为

用于在 MacOS 上复制随机数的 Python 3.8 多处理

起底多线程同步锁(iOS)

python高性能编程--003--线程之Thread和threading

在macOS上通过pyenv安装和切换多版本Python

macOS下Python多版本控制软件的安装:pyenvpyenv-virtualenv