【问题标题】:Python - Threading takes too much CPUPython - 线程占用过多 CPU
【发布时间】:2019-08-22 13:39:29
【问题描述】:

所以我有一个 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 ,我尝试使用 multiprocessing 库来解决这个问题,但不幸的是,多处理似乎在 OSX 中无法正常工作。

谁能给点建议?

【问题讨论】:

标签: python-3.x multithreading cpu


【解决方案1】:

这种行为是意料之中的。如果myFunc 是一个需要时间的 CPU 密集型任务,您可能会启动多达 30k 个线程来执行此任务,这将使用所有机器资源。

您的代码的另一个潜在问题是线程在内存方面很昂贵(每个线程使用 8MB 内存)。创建 30k 线程将使用多达 240GB 的内存,而您的机器可能没有,并且会导致 OutOfMemoryError。

最后,该代码的另一个问题是您的主例程正在启动所有这些线程,但没有等待它们中的任何一个完成执行。这意味着最后启动的线程很可能要到最后才会运行。

我建议使用ThreadPoolExecutor 来解决所有这些问题:

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 在此程序使用的资源量和适合您的执行速度之间找到平衡。

【讨论】:

    猜你喜欢
    • 2013-11-05
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多