Python-线程占用太多CPU

时间:2019-08-22 13:39:29

标签: python-3.x multithreading cpu

所以我有一个Python 3.7程序,该程序使用Threading库进行多进程任务

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中似乎无法正常工作。

任何人都可以建议吗?

1 个答案:

答案 0 :(得分:0)

这种现象是可以预期的。如果myFunc是一项耗时的CPU密集型任务,那么您可能要启动多达3万个线程来执行此任务,这将占用所有计算机资源。

您的代码的另一个潜在问题是线程在内存方面很昂贵(每个线程使用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来找到该程序使用的资源量与适合您的执行速度之间的平衡。