2017-08-14 60 views
0

我有一个以下问题。我试图重构我的代码,以便使用多线程处理API调用。我的核心数据是以下格式的元组的简单列表:Python的pool.map列表元组

lst = [('/Users/sth/photo1.jpg', 
     '/Users/sth/photo2'), 
     ('/Users/sth/photo1.jpg', 
     '/Users/sth/photo3'), (...)] 

功能,我使用需要LST列表,并对其进行处理,通过这需要对照片的API。毕竟每一对都返回一个数字。到目前为止,我正在使用一个循环将一个元组放入我的函数中,并生成所提到的数字。我想以一种方式占用我列表的一部分并调用批处理内的元组的函数的方式将整个计算对齐。要做到这一点,我试图用池功能多模块:

from multiprocessing.dummy import Pool as ThreadPool 
pool = ThreadPool(2) 
results = pool.map(score_function, lst) 

然而,出现以下错误:

IOError: [Errno 2] No such file or directory: 'U' 

奇怪的事情发生在这里。它试图将我元组中的单个字符作为参数。任何想法如何正确地做到这一点?

谢谢

@edit

缺乏score_function定义的是我不好。让我更新的问题:

def score_function(pairs): 
    score_list = list() 

    for pair in pairs: 
     score = findElement(target = pair[0], source = pair[1]) 
     score_list.append([pair[0], pair[1], score]) 

    return score_list 

凡findElement被定义为:

def findElement(target, source): 

    with open(source, 'rb') as source_: 
     source_bytes = source_.read() 

    with open(target, 'rb') as target_: 
     target_bytes = target_.read() 

    score = API_request(target_bytes = target_bytes, 
         source_bytes = source_bytes) 
    return score 
+0

您是否也可以分享您的score_function,至少关键部分如定义以及如何访问该参数。 – Hannu

+0

@Hannu你说得对。我刚刚添加了score_function定义 –

+1

我发布了另一个答案,它应该有所帮助。 – Hannu

回答

1

你的问题是for循环。它将你的元组分割成单独的字符串。做到这一点,它应该工作:

def score_function(pairs): 
    score_list = list() 

    score = findElement(target = pairs[0], source = pairs[1]) 
    score_list.append([pairs[0], pairs[1], score]) 

    return score_list 

你可能认为你的score_function会收到lst变量作为参数。这不会发生。 lst需要是一个列表,因为它是在你的情况,并且pool.map会自动将其分割为单个元素,并且只将一个元素提供给score_function并继续执行,直到整个列表已被工作人员处理完毕。每个对工作人员的调用都会收到一个参数,它只是它应该处理的一个元素。你的单个元素是元组(path1,path2),当你在这个元组上调用for时,你的循环中只会收到一个单独的路径(字符串),pair [1]只是这个字符串的第二个字符。

希望这会有所帮助。

1

不知道你score_function以及如何定义和访问它,我想,你有什么样

def score_function(param): 
    with open(param[1], "r") as fp: 
     .... 

在那里。

错误表明你的参数不是一个元组,而是一个字符串(param [1],如果param是一个元组,则是第二个元素,而param [1],如果param是一个字符串,将会是第二个字符,在你的情况下来自/ Users ...)。把

print param 

那里,看看它是什么。无论你的lst是否全都是错误的,并且缺少圆括号,并且pool.map会将其扁平化并以字符串的形式将每个单独的组件发送到函数中,或者在您的lst中有一个违规条目不是元组。举例来说,如果有一个条目,你忘了把它周围的括号,就每一个人发送字符串作为参数

lst = [('/Users/bar/photo1.jpg', '/Users/bar/photo2'), 
     ('/Users/bar/photo2.jpg', '/Users/bar/photo3'), 
     '/Users/bar/photo3.jpg', '/Users/bar/photo4', 
     (...., .....), (...., .....)] 

它能够处理的前两个,但第三(和第四,因为它现在是一个单独的条目而不是元组中的第二个组件)将会导致你现在正在得到的错误。无论哪种方式,打印出您的score_function收到的参数应该可以帮助您找出问题所在。你使用pool.map是正确的,它应该可以工作,假设你的输入是你期望的。