【问题标题】:Passing list to pool.map() function in Python returns each character for each item in the list将列表传递给 Python 中的 pool.map() 函数会返回列表中每个项目的每个字符
【发布时间】:2018-08-23 19:01:18
【问题描述】:

这个在 Windows 上运行的 Python 2.7 脚本没有像我预期的那样输出。

from multiprocessing import Pool
from multiprocessing.dummy import Pool as ThreadPool

def function1():
    function1List = ["11" ,'22' , '33']
    return function1List

def function2(passedList):
    for item in passedList:
        print item

list = function1()
#print list    used to verify list

if __name__ == '__main__':
    pool = ThreadPool()
    pool.map(function2, list)
    pool.close() 
    pool.join()

我的期望

11
22
33
44

我实际上得到了什么

1
1
2
2
3
3
4
4

我错过了什么?

【问题讨论】:

    标签: python multiprocessing threadpool pool


    【解决方案1】:

    map 正在将每个列表中的一项传递给function2

    然后,在function2 中,您将遍历该项目,获取字符串的每个字符。

    这和你写的完全一样:

    values = ["11" ,'22' , '33']
    for value in values:
        for item in value:
            print item
    

    那么,你如何解决它?好吧,这取决于你想要什么。

    如果您希望每个任务都获得一个列表项,就像现在一样,您只需更改 function2 即可:

    def function2(item):
        print item
    

    如果您希望每个任务都获得一个列表,您必须将您调用的map 更改为列表列表。我不确定你想要什么列表,但你可以传递四个单元素列表:

    values = [[value] for value in values]
    

    …或一个四元素列表:

    values = [values]
    

    …或两个二元素交错列表:

    values = [values[::2], values[1::2]]
    

    ……或任何你想要的东西。

    【讨论】:

    • 感谢您澄清这一点。 Function2 实际上需要接受列表中的每一项,并通过另一个循环运行每一项。这就是为什么我将循环放在 function2 中进行测试。 Function1 通过网络爬虫创建一个列表。 Function2 循环遍历该列表的每个项目并对其进行处理。上面的代码是我试图在function2上使用多处理
    • @olaHalo 这行得通,但对你没有多大好处。那样你只有一个任务,那为什么还要首先使用池呢?
    • 我终于把头绕过去了。 Pool.map(method, argument) 已经为我循环了。所以我对 function2 所做的就是再次循环它,这导致它分解了每个字符。你解释得很清楚,但直到现在才点击。
    • @olaHalo 没错。这是一旦点击就很明显的事情之一,但是在点击之前要完成一个巨大的痛苦;每个人都经历过……
    猜你喜欢
    • 2018-02-02
    • 2014-12-01
    • 2017-08-23
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多