【发布时间】: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 的新电源调优。这是解决方案。
【问题讨论】:
-
当你说“Python 3.9”时,你是指通过 Rosetta 还是原生 Python?
-
我用conda用python 3.9(Rosetta)创建了另外一个环境来测试是否和python 3.8相关。我更改为完整的测试代码,以便您在拥有 Apple Silicon/Monterey 机器时进行测试。非常感谢。
标签: python python-multithreading apple-silicon macos-monterey rosetta-2