我在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
会出现此错误。有什么建议 ?谢谢
答案 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)):
实际上是在len
或int
上调用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
函数隐含地完成的)