Python 多线程在 MacOS 上不起作用 Monterey/Apple Silicon
Python multithreading didn't work at MacOS Monterey/Apple Silicon
我有一个 python 3.8 脚本 运行 多线程与 concurrent.futures 模块,在 MacOS Catalina (Intel) 中运行良好。迁移到 MacOS Monterey (Apple Silicon) 后。 python 代码由于使用单线程运行时间较长。我正在使用 Anaconda 附带的 python,即 Rosetta 2 下的 x86_64 和 运行。尝试 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 的新电源调整。这是解决方案。
您的代码在 macOS Big Sur 上按预期运行,它已经是 Apple Silicon,原生 Python 3.9。
看起来罪魁祸首是 Rosetta 或 Monterey,而不是您的代码,但我在 Rosetta 上使用 Swift 时确实看到了一些奇怪的错误。你考虑过那样看吗?
我有一个 python 3.8 脚本 运行 多线程与 concurrent.futures 模块,在 MacOS Catalina (Intel) 中运行良好。迁移到 MacOS Monterey (Apple Silicon) 后。 python 代码由于使用单线程运行时间较长。我正在使用 Anaconda 附带的 python,即 Rosetta 2 下的 x86_64 和 运行。尝试 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 的新电源调整。这是解决方案。
您的代码在 macOS Big Sur 上按预期运行,它已经是 Apple Silicon,原生 Python 3.9。
看起来罪魁祸首是 Rosetta 或 Monterey,而不是您的代码,但我在 Rosetta 上使用 Swift 时确实看到了一些奇怪的错误。你考虑过那样看吗?