这可能是一个很简单的问题,但肯定让我筋疲力尽。 为了使用多处理,我编写了以下代码。main函数创建两个进程,它们都使用相同的函数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()检索结果以进行进一步处理。在
^{pr2}$你能帮我解决在多重处理中如何从一个函数返回多个值吗?在
使用共享状态的并行编程是一条崎岖的道路,即使是经验丰富的程序员也会犯错。一个对初学者更友好的方法是复制数据。这是在子进程之间移动数据的唯一方法(不完全正确,但这是一个高级主题)。在
引用https://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes,您需要设置一个多处理队列为每个子流程填充返回的数据。之后,您可以将要读取的队列传递到下一个阶段。在
对于多个不同的数据集,如层、节点、树等,可以使用多个队列来区分每个返回值。为每个队列使用一个队列似乎有点混乱,但它简单易懂而且安全。在
希望有帮助。在
如果您希望从
multiprocessing
获取多个返回值,那么您可以这样做。下面是一个简单的示例,首先是在串行python中,然后是multiprocessing
:因此,要从带有
multiprocessing
的函数返回多个值,您只需要有一个返回多个值的函数……您只需将这些值作为元组列表返回。在multiprocessing
的主要问题是大多数函数没有序列化。所以,如果你真的想做你想做的事情…我强烈建议你使用pathos
(如下所述)。使用multiprocessing
最大的障碍是作为目标传递的函数必须是可序列化的。您可以对prepare_input_data
函数进行一些修改……第一个修改是确保它被封装。如果您的函数没有完全封装(例如,它在自己的作用域之外有名称引用查找),那么它可能不会使用pickle
进行pickle。这意味着您需要在目标函数中包含所有导入,并通过函数输入传递任何其他变量。您看到的错误(UnPicklableError
)是由于目标函数及其依赖项无法序列化,也不是因为您不能从multiprocessing
返回多个值。在尽管作为一个好的实践,我还是将目标函数封装起来,但它可能有点乏味,并且可能会使代码慢一点。我还建议您将代码转换为使用}中的大多数python对象,而不必太担心花太多精力重构代码,以确保普通的}可以处理它。在
dill
,并且pathos.multiprocessing
dill
是一个高级序列化程序,可以对几乎所有python对象进行pickle,pathos
提供了一个使用dill
的multiprocessing
分叉。这样,您就可以传递pipe
(即apply
)或{pickle
和{另外,我将使用异步
map
而不是执行上面的操作。pathos.multiprocessing
具有在map
函数中获取多个参数的能力,因此您不需要像上面所做的那样将它们包装在元组args
中。使用异步map
时,接口应该更干净,如果需要,可以返回多个参数……只需将它们打包在一个元组中。在这里有一些例子可以证明我上面所指的。在
返回多个值:
^{pr2}$异步映射: Python multiprocessing - tracking the process of pool.map operation
pathos
: Can't pickle <type 'instancemethod'> when using python's multiprocessing Pool.map()pathos
: What can multiprocessing and dill do together?我们仍然无法运行您的代码…但如果您发布可以运行的代码,则可能会有助于编辑代码(使用
pathos
fork和异步map
或其他方法)。在仅供参考:
pathos
的发行版有点过期(也就是说晚了),所以如果你想试试的话,最好在这里得到代码:https://github.com/uqfoundation相关问题 更多 >
编程相关推荐