【发布时间】:2015-02-04 17:53:04
【问题描述】:
这可能是一个非常简单的问题,但绝对让我筋疲力尽。 为了使用多处理,我编写了以下代码。主函数创建两个进程,它们都使用相同的函数,称为 prepare_input_data() 但处理不同的输入数据集。此函数必须为每个输入返回多个对象和值,以便在代码的后续步骤中使用(此处不包括在内)。
我想要的是获得多个值或对象作为我在多处理中使用的函数的返回。
def prepare_input_data(inputdata_address,temporary_address, output):
p=current_process()
name = p.name
data_address = inputdata_address
layer = loading_layer(data_address)
preprocessing_object = Preprocessing(layer)
nodes= preprocessing_object.node_extraction(layer)
tree = preprocessing_object.index_nodes()
roundabouts_dict , roundabouts_tree= find_roundabouts(layer.address, layer, temporary_address)
#return layer, nodes, tree, roundabouts_dict, roundabouts_tree
#return [layer, nodes, tree, roundabouts_dict, roundabouts_tree]
output.put( [layer, nodes, tree, roundabouts_dict, roundabouts_tree])
if __name__ == '__main__':
print "the data preparation in multi processes starts here"
output=Queue()
start_time=time.time()
processes =[]
#outputs=[]
ref_process = Process(name ="reference", target=prepare_input_data, args=("D:/Ehsan/Skane/Input/Skane_data/Under_processing/identicals/clipped/test/NVDB_test3.shp", "D:/Ehsan/Skane/Input/Skane_data/Under_processing/temporary/",output))
cor_process = Process(name ="corresponding", target=prepare_input_data, args=("D:/Ehsan/Skane/Input/Skane_data/Under_processing/identicals/clipped/test/OSM_test3.shp", "D:/Ehsan/Skane/Input/Skane_data/Under_processing/temporary/",output))
#outputs.append(ref_process.start)
#outputs.append(cor_process.start)
ref_process.start
cor_process.start
processes.append(ref_process)
processes.append(cor_process)
for p in processes:
p.join()
print "the whole data preparation took ",time.time()-start_time
results={}
for p in processes:
results[p.name]=output.get()
########################
#ref_info = outputs[0]
# ref_nodes=ref_info[0]
上一个错误 当我使用 return 时,ref_info[0] 有 Nonetype。
错误: 根据here 的答案,我将其更改为传递给函数的 Queueu 对象,然后我使用 put() 添加结果并使用 get() 检索它们以进行进一步处理。
Traceback (most recent call last):
File "C:\Python27\ArcGISx6410.2\Lib\multiprocessing\queues.py", line 262, in _feed
send(obj)
UnpickleableError: Cannot pickle <type 'geoprocessing spatial reference object'> objects
您能帮我解决如何从多处理中的函数返回多个值吗?
【问题讨论】:
-
你好像忘了问问题!
-
@MarcusMüller:现在可能更清楚了。
-
... 作为函数的返回... 但您目前没有返回 anything,也没有在寻找在从任何地方返回的值。你能写一个最小且独立的例子来展示你真正想要做什么吗?您发布的大部分代码似乎与多处理问题无关。
-
@Useless:我的函数中有返回值,其语法为 return,但后来我将其更改为 Queue.put(),因为我不断收到 Nonetype。
-
这个问题绝对不是很清楚......但看看你的错误,你似乎将一个无法“腌制”的对象(在
python中序列化)传递给多处理队列。您可以传递一个可选值(例如字符串、整数),或者...*讨厌的解决方案*将其设置在全局变量中。
标签: python return multiprocessing pickle