首先,这是我第一次尝试多线程或多处理(在教程之外)。我试图通过使用多线程或多处理来加速类中的一些初始化,但不确定哪一个更有意义。我的代码是这样的
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
中的文件列表,我正在寻找加快速度的方法。
我感谢任何帮助,请善待菜鸟!
我已经尝试了上述代码块的多线程和多处理。我能够让他们工作,但我没有看到完成速度的提高。有些方法实际上更长。
在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()
.这里的细节是工作可能需要不同的时间。 放宽对结果交付顺序的限制 让多处理库更积极地安排作业, 大部分时间让更多核心保持忙碌,即使在场 掉队者。