为什么在map周围包装list()导致函数运行?

时间:2015-12-15 20:26:49

标签: python multithreading

我想解决的问题是映射多线程庄园中的函数列表。这些函数既可以打印出来,也可以返回值。这些返回值中的每一个都将存储在列表中。这是代码......

 import threading
 import time

 def PauseAndPrint1Seconds(num):
    time.sleep(1)
    print("Finished Pausing" + num)
    return [1]

 def PauseAndPrint2Seconds(num):
    time.sleep(2)
    print("Finished Pausing" + num)
    return [2, 2]

 def PauseAndPrint3Seconds(num):
    time.sleep(3)
    print("Finished Pausing" + num)
    return [3, 3, 3]

 def PauseAndPrint4Seconds(num):
    time.sleep(4)
    print("Finished Pausing" + num)
    return [4, 4, 4, 4]


 myfuncs = [PauseAndPrint1Seconds, PauseAndPrint2Seconds, PauseAndPrint3Seconds, PauseAndPrint4Seconds]

 result = [None] * len(myfuncs)

 def wrapFunc(i, num):
    result[i] = myfuncs[i](num)

 mythreads = [threading.Thread(target=wrapFunc, args = (i, " 12345")) for i in range(len(myfuncs))]

 map(lambda x: x.start(), mythreads)

 map(lambda x: x.join(), mythreads)

线程从未启动过,我得到了回复......

 >>> map(lambda x: x.start(), mythreads)
 <map object at 0x7fd1a551b3c8>


 >>> result
 [None, None, None, None]

如果我将map函数更改为简单循环,它似乎可以正常工作

>>> for x in mythreads:
...     x.start()

Finished Pausing 12345
Finished Pausing 12345
Finished Pausing 12345
Finished Pausing 12345

>>> result
[[1], [2, 2], [3, 3, 3], [4, 4, 4, 4]]

同样奇怪的是,如果我用list()调用包装地图,那么确实无法正常工作的地图函数。

 >>> list(map(lambda x: x.start(), mythreads))
 [None, None, None, None]
 Finished Pausing 12345
 Finished Pausing 12345
 Finished Pausing 12345
 Finished Pausing 12345

 >>> result
 [[1], [2, 2], [3, 3, 3], [4, 4, 4, 4]]

结束一些事情...... 我是Python新手,如果我错过了一些基本的东西,那就很抱歉 我知道有一种更简单的方法可以做到这一点。这是我理解的问题。

2 个答案:

答案 0 :(得分:5)

这是Python2和Python3之间的区别。

Python3返回一个地图对象,它记住需要做什么(比如生成器),但在你要求结果之前不做任何工作(根据地图对象的结果创建一个列表是要求它们全部立刻)

Python2中的

map已经返回一个列表,因此类似于Python3中的list(map(...))

通常不会将Pythonic视为其副作用而使用地图或列表推导。如果您刚刚使用了for循环,那么事情发生的时间就没有歧义

for x in mythreads:
    x.start()

答案 1 :(得分:0)

地图函数返回生成器。这意味着,当您尝试获取结果时,它会调用该函数:list(map(..))