Python多处理-Pool.map的结果为None
我正在努力让我的多进程启动并运行。下面是我的代码示例Python多处理-Pool.map的结果为None,python,multiprocessing,Python,Multiprocessing,我正在努力让我的多进程启动并运行。下面是我的代码示例 import pandas as pd import networkx as nx import ast import numpy as np import itertools import glob from multiprocessing import Pool as ProcessPool def network_inference(year) # some code that generate a net and a d
import pandas as pd
import networkx as nx
import ast
import numpy as np
import itertools
import glob
from multiprocessing import Pool as ProcessPool
def network_inference(year)
# some code that generate a net and a df_complete dataframe
res = pd.Series()
res['YEAR'] = year
res['NODES'] = net.number_of_nodes()
res['EDGES'] = net.number_of_edges()
return (res, df_complete['VENUE_CLASS'].value_counts())
if __name__=='__main__':
years = [x.replace('\\','/').replace('data_of_interest.csv','') for x in glob.glob('data/raw/*/data_of_interest.csv')][:10]
pool = ProcessPool(50)
results = pool.map_async(network_inference, years)
pool.close()
pool.join()
results.wait()
l = results.get()
structure = pd.DataFrame()
for s1,s2 in l:
structure = structure.append(s1.append(s2), ignore_index=True)
structure.to_csv('data/structure_data_features.csv', index = False)
正如您所看到的,映射函数在文件列表上非常简单。每个进程都返回一个元组。因此,当我调用result.get()
时,问题就出现了。代码运行时,出现以下错误:
Traceback (most recent call last):
File "/AD-HOME/------/Desktop/dblp/network_inference.py", line 132, in <module>
for s1,s2 in l:
TypeError: 'NoneType' object is not iterable
回溯(最近一次呼叫最后一次):
文件“/AD-HOME/----/Desktop/dblp/network_interference.py”,第132行,在
对于l中的s1、s2:
TypeError:“非类型”对象不可编辑
但是,如果稍后在错误发生后,我在Ipython终端(我使用的是Spyder)中询问结果(results.get()
),我会得到正确的输出。我想发布一个完整的mwe
,但是,我无法用更简单的代码重现此错误,也无法发布原始错误
我正在寻找解决此问题的方法,我知道在调用
map
时,我需要等待它计算所有内容(我相信我正在使用join()
然后使用results.wait()
)。我建议使用和管理上下文:
if __name__=='__main__':
years = [x.replace('\\','/').replace('data_of_interest.csv','') for x in glob.glob('data/raw/*/data_of_interest.csv')][:10]
with ProcessPool(50) as pool:
results = pool.map_async(network_inference, years)
l = results.get()
structure = pd.DataFrame()
for s1,s2 in l:
structure = structure.append(s1.append(s2), ignore_index=True)
structure.to_csv('data/structure_data_features.csv', index = False)
您可以使用此方法删除close
和join
,然后在离开ProcessPool
的上下文之前,需要访问结果并对其进行处理。当您关闭
和加入
时,您的结果将在访问之前被删除
您也不需要在此处等待,因为您正在使用.get()
,之后将立即等待结果。只是为了澄清一下,您在处理池中使用了什么?我添加了导入部分@MyNameIsCalebIf如果您要立即在池中等待,您不能改用blockingpool.map
?我想这可以解决问题。是的,对不起。它返回None,与我在问题中提到的错误相同@AndrasDeak@AndrasDeak我已经试过了,甚至在Spyder外面跑步。