python-3.x - Python - 线程占用过多的 CPU
问题描述
所以我有一个 Python 3.7 程序,它使用线程库来多处理任务
def myFunc(stName,ndName,ltName):
##logic here
names = open('names.txt').read().splitlines() ## more than 30k name
for i in names:
processThread = threading.Thread(target=myFunc, args=(i,name2nd,lName,))
processThread.start()
time.sleep(0.4)
我必须打开多个窗口才能完成具有不同输入的任务,但最终我遇到了一个非常滞后的情况,我什至无法浏览我的OSX,我尝试使用多处理库来解决问题,但不幸的是,多处理似乎不是在 OSX 中正常工作。
任何人都可以建议?
解决方案
这种行为是意料之中的。如果myFunc
是一个需要时间的 CPU 密集型任务,您可能会启动多达 30k 个线程来执行此任务,这将使用所有机器资源。
您的代码的另一个潜在问题是线程在内存方面很昂贵(每个线程使用 8MB 内存)。创建 30k 线程将使用多达 240GB 的内存,而您的机器可能没有,并且会导致 OutOfMemoryError。
最后,该代码的另一个问题是您的主例程正在启动所有这些线程,但没有等待它们中的任何一个完成执行。这意味着最后启动的线程很可能直到最后才运行。
我建议使用 aThreadPoolExecutor
来解决所有这些问题:
from concurrent.futures.thread import ThreadPoolExecutor
def myFunc(stName,ndName,ltName):
##logic here
names = open('names.txt').read().splitlines() ## more than 30k name
num_workers = 8
with ThreadPoolExecutor(max_workers=num_workers) as executor:
for i in names:
executor.map(myFunc, (i, name2nd, lName))
您可以num_workers
尝试在该程序使用的资源量和适合您的执行速度之间找到平衡。
推荐阅读
- amazon-web-services - AWS Lambda 计划速率(0 分钟)
- c# - 禁用 EF 表创建
- rest-assured - 放心 - Json 提取物
- python - 按列表列表中的索引计算最小值或最大值
- java - 如何为 java 版本 10 安装 JDBC 驱动程序
- reactjs - 通过标题 ReactJS 滚动重叠
- c++ - 通过 OpenSSL C++ 从证书中获取颁发者证书
- c# - 无法创建新的 Active Directory 组。C# 和 LDAP
- python - swift python奇怪的输出
- r - How do I convert multiple pdf's into a corpus for text analysis in R?