gpt4 book ai didi

python - multiprocessing - 使用不同的输入文件调用函数

转载 作者:行者123 更新时间:2023-11-28 22:34:12 25 4
gpt4 key购买 nike

我有一个函数,它读入一个文件,将该文件中的记录与另一个文件中的记录进行比较,并根据规则将文件中的记录附加到两个列表之一。

我有一个空列表,用于将匹配的结果添加到:

match = []

我有一个列表限制,我想将一系列文件中的记录与之进行比较。

我有一个读取文件的功能,我想看看是否包含任何匹配项。如果有匹配项,我会将记录追加到 match 列表中。

def link_match(file):
links = json.load(file)
for link in links:
found = False
try:
for other_link in other_links:
if link['data'] == other_link['data']:
match.append(link)
found = True
else:
pass
else:
print "not found"

我有很多文件需要比较,因此我希望使用多处理库。

我创建了一个文件名列表作为函数参数:

list_files=[]
for file in glob.glob("/path/*.json"):
list_files.append(file)

然后我使用 map 特性来调用具有不同输入文件的函数:

if __name__ == '__main__':
pool = multiprocessing.Pool(processes=6)
pool.map(link_match,list_files)
pool.close()
pool.join()

CPU 使用率飙升,通过在函数循环中添加打印行,我可以看到正在找到匹配项并且函数运行正常。

但是,匹配 结果列表仍然是空的。我做错了什么?

最佳答案

multiprocessing 为池中的每个进程运行一个新的 Python 实例 - 上下文为空(如果您使用 spawn 作为启动方法)或复制(如果您使用 fork),加上你传入的任何参数的副本(无论哪种方式),然后它们都是分开的。如果您想在分支之间传递数据,还有其他几种方法。

  1. 与其写入内部列表,不如写入文件并在完成后从中读取。这里最大的潜在问题是一次只能将一件事写入文件,所以要么你创建很多单独的文件(之后必须读取所有文件),要么它们相互阻塞。
  2. 继续多处理,但使用 multiprocessing.Queue而不是列表。这是专门为您当前的用例提供的对象:使用多个进程并需要在它们之间传递数据。假设您确实应该使用 multiprocessing(您的情况对于 threading 不会更好,见下文),这可能是您的最佳选择。
  3. 代替多处理,使用threading .单独的线程都共享一个环境。这里最大的问题是 Python 只允许一个线程在每个进程中一次实际运行 Python 代码。这称为全局解释器锁 (GIL)。 threading 因此在线程将等待外部进程(其他程序、用户输入、读取或写入文件)时很有用,但如果大部分时间花在 Python 代码上,它实际上需要更长的时间(因为切换线程需要一点时间,而你没有做任何事情来节省时间)。这有自己的 queue .如果您使用 threading,您可能应该使用它而不是普通列表 - 否则,如果它在错误的时间切换线程,则两个线程同时访问列表可能会相互干扰.

哦,顺便说一下:如果您使用线程,Python 3.2 及更高版本改进了 GIL 的实现,这看起来至少很有帮助。很多关于线程性能的东西都非常依赖于您的硬件(CPU 内核的数量)和您正在执行的具体任务 - 可能最好尝试几种方法,看看哪种方法适合您。

关于python - multiprocessing - 使用不同的输入文件调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39211309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com