python pool.map中的多线程引发TypeError:'float'类型的对象没有len()

时间:2017-05-29 11:49:32

标签: python multithreading threadpool

我在Python中第一次尝试多线程。我看到documentation here。以下是我的示例代码

from multiprocessing.dummy import Pool as ThreadPool

pool = ThreadPool(4)
mylist = [3,4,5,6,7,8, ..., 5]
results = pool.map(my_method, my_list) # from docs it is clear that pool.map takes method and argument as a list 

def my_method(mylist):
    data = []
    for i in range (len(mylist)):
        # do something using mylist = subdata
        data.append(subdata)
    return data 

它返回以下错误

Traceback (most recent call last):
  File "C:/Users/algorithm.py", line 30, in my_method
    for i in range (len(mylist)):
TypeError: object of type 'float' has no len()

从文档中可以清楚地看出pool.map需要函数和列表(see this tutorial too),但为什么假设my_listfloat会出现此错误。有什么建议 ?谢谢

2 个答案:

答案 0 :(得分:3)

这段代码有什么作用?

results = pool.map(my_method, my_list)

多次调用my_method,每次都会从列表my_list中传入一个元素,请参阅:https://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.multiprocessing.Pool.map

  

map(func,iterable [,chunksize])   map()内置函数的并行等价物(它只支持一个可迭代的参数)。它会阻塞,直到结果准备就绪。

     

这个方法将迭代器切成了许多块   作为单独的任务提交到进程池。 (近似)大小   可以通过将chunksize设置为正数来指定这些块   整数。

所以

for i in range (len(mylist)):

实际上是在lenint上调用float您是否意味着

for i in range (mylist):

答案 1 :(得分:2)

mylist = [3,4,5,6,7,8, ..., 5]
results = pool.map(my_method, my_list)

所以pool.map可以使用函数和列表,但是为每个插槽调用my_method列表中的一个元素(以执行“分布式”循环)

所以在你的函数中mylist是列表的一个元素,而不是列表本身(并且循环在它上面是没有意义的,因为循环是由map函数隐含地完成的)