【问题标题】:Multithreading in python pool.map raises TypeError: object of type 'float' has no len()python pool.map 中的多线程引发 TypeError:“float”类型的对象没有 len()
【发布时间】:2017-05-29 11:49:31
【问题描述】:

我第一次在 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_list 假设为float 会给出此错误。有什么建议么 ?谢谢

【问题讨论】:

    标签: python multithreading threadpool


    【解决方案1】:

    这段代码有什么作用?

    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)):
    

    实际上是在intfloat 上调用len,您是不是想说

    for i in range (mylist):
    

    【讨论】:

      【解决方案2】:
      mylist = [3,4,5,6,7,8, ..., 5]
      results = pool.map(my_method, my_list)
      

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-15
        • 2021-01-23
        • 2015-01-21
        • 2021-03-03
        相关资源
        最近更新 更多