多线程/循环处理不起作用或比原始定义慢

问题描述 投票:0回答:1

首先,这是我第一次尝试多线程或多处理(在教程之外)。我试图通过使用多线程或多处理来加速类中的一些初始化,但不确定哪一个更有意义。我的代码是这样的

import threading

classlist = []

filelist = ['a','b','c'] #it's a list of string paths

def loadClasses(filelist):
    global classlist, filelist
    classlist = [OtherClass(i) for i in filelist]

def threadingfunc(filelist):
    t1.threading.Thread(target=loadClasses)

threadingfunc()
        

与我只运行

loadClass
函数相比,这似乎需要两倍的时间。
OtherClass
运行大约需要 1.5 秒,但是当我要加载大约 40 个文件时,它就会增加。

我尝试用多处理尝试同样的事情,但它似乎根本不起作用。 就多处理而言,我没有运气让任何事情发挥作用。这和我用过的很接近。

from multiprocessing import Pool

classlist = []
def loadClass(file):
    classlist.append(OtherClass(file))

def pool_handler():
    p = Pool(2)
    for file in filelist:
        p.map(loadClass, file)

这花费了大约相同的时间。所以我不知道从这里该去哪里。 长话短说,我有一个要加载到我的

OtherClass
中的文件列表,我正在寻找加快速度的方法。 我感谢任何帮助,请善待菜鸟!

我已经尝试了上述代码块的多线程和多处理。我能够让他们工作,但我没有看到完成速度的提高。有些方法实际上更长。

python multithreading multiprocessing
1个回答
0
投票

Python 线程

在C++中使用线程可以让你烧掉所有核心,并且更快地完成。

在 python 中使用线程通常只是感兴趣的 用于像 Web 服务器这样的 I/O 绑定进程。 每个线程必须获取 吉尔 在完成任何工作之前,所以应用 python 线程 从事计算密集型工作通常不会获胜。


棉绒

def loadClass(file):

Pep-8 好心地问你:请拼写

load_class

这一点尤其重要,因为函数 under考虑显然不是一个类。 无需引起

LoadClass
双重困惑。


核心

    p = Pool(2)

有可能您使用的是具有两个核心的奔腾。 但更有可能的是您有超过五个可用核心。 您可以指定一个更大的数字,但您可能更愿意 让它默认为运行时检测到的核心数量。

开销:序列化

for file in filelist:
您提到每个“加载”操作大约需要 1500 毫秒。
这对于这条线来说似乎是一个很好的阻抗匹配。
我只想提一下,如果每个操作只运行
一小部分秒,那么你可能会考虑
将多个 

file

 条目批量放入一个元组中,
并将它们通过管道连接发送
批量中的每个子进程。

开销:反序列化

p.map(load_class, file)
我不知道你的加载类函数返回什么。
特别不知道连载起来是否很难,
或者如果它返回千字节或兆字节的返回值。
很明显你忽略了
无论它可能返回什么,所以我希望它总是返回

None

。
根据详细信息,您可能会花费
许多 CPU 周期反序列化结果值
立即被丢弃。

结果顺序

看来你并不关心

何时事情发生 只要它们最终会发生,所以你可能会感兴趣 在几个 pool.map() 变体中,包括 imap_unordered()

.
这里的细节是工作可能需要不同的时间。 放宽对结果交付顺序的限制 让多处理库更积极地安排作业, 大部分时间让更多核心保持忙碌,即使在场 掉队者。

© www.soinside.com 2019 - 2024. All rights reserved.