Python多线程在MacOS Monterey/Apple Silicon上无法工作

4

我有一个使用concurrent.futures模块在多线程下运行的Python 3.8脚本,可以在MacOS Catalina (Intel)上正常运行。但是当迁移到MacOS Monterey (Apple Silicon)后,由于使用单线程,Python代码运行时间较长。我使用的是Anaconda自带的x86_64 Python,并在Rosetta 2下运行。尝试了从Anaconda安装的Python 3.9,结果相同。如果有人能提供解决方案或变通方法,我将不胜感激。谢谢。

以下是一个测试代码以展示问题。在旧设备上,它运行了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.')

更新:

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

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


当你说“Python 3.9”时,你是指通过Rosetta还是本地Python? - riffle_shuffle
我使用conda创建了另一个Python 3.9(Rosetta)环境来测试它是否与Python 3.8有关。我改变了完整的测试代码,这样你就可以在拥有Apple Silicon/Monterey机器的情况下进行测试。非常感谢。 - angle
1个回答

1

您的代码在已经支持Apple Silicon的macOS Big Sur上运行正常,使用本地Python 3.9。

看起来问题可能是Rosetta或Monterey而不是您的代码,但我在使用Rosetta处理Swift时遇到了一些奇怪的错误。您考虑过这个方向吗?


今晚我会使用本地的Python 3.9进行测试,并稍后更新。非常感谢。 - angle
经过进一步调查,发现多线程工作正常,但是一些多线程代码被冻结了。似乎多线程循环死锁了。我不知道这是否与yfinance模块(用于下载股票信息)有关。但问题在更改为本机Python 3.9后得到解决。从Anaconda更改为minforge。非常感谢。 - angle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接