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如果您要立即在池中等待,您不能改用blocking
pool.map
?我想这可以解决问题。是的,对不起。它返回None,与我在问题中提到的错误相同@AndrasDeak@AndrasDeak我已经试过了,甚至在Spyder外面跑步。