python 池不 运行 按列表中的每个项目运行
python pool doesnt run function by each item in a list
我尝试将池用于多处理目的。检查我的代码:
def func1(x):
print x
if __name__ == "__main__":
myList = ["111","222","333","444"]
p = Pool(processes=4)
res1 = p.map(func1,myList)
我认为导出必须是什么:
222
111
333
444
它给出了什么:
3332
122411
44
我做错了什么?
正如 Kounis 在评论中所说,Pool
创建了一组用于异步任务处理的进程。此外,Pool.map
的 doc 明确表示处理将是 并行 。
实际上,由于您正在创建一个具有 4 个工作进程的 Pool
,当您 post 4 个元素的 map
时,每个元素都会立即由一个工作进程处理.因此,print x
s 被同时执行。
你的代码没有问题;它完全符合预期。
如果您相信无论什么先执行,它都应该阻止所有其他执行直到完成,这可能会让您感到困惑。值得庆幸的是,这不是真的,因为如果是这样,那就不是并行编程了。您正在启动 4 个并行进程,它们都写入标准输出 (stdout
),而不考虑优先级,因此您创建了某种可以任意解决的竞争条件。
尝试写入 4 个单独的文件而不是 stdout(请参见下面的代码),您会更清楚地看到并行代码的结果;文件是同时而不是连续生成的。
def func1(x):
with open('file_{}'.format(x), w) as f:
f.write(x)
if __name__ == "__main__":
myList = ["111","222","333","444"]
p = Pool(processes=4)
res1 = p.map(func1,myList)
我尝试将池用于多处理目的。检查我的代码:
def func1(x):
print x
if __name__ == "__main__":
myList = ["111","222","333","444"]
p = Pool(processes=4)
res1 = p.map(func1,myList)
我认为导出必须是什么:
222
111
333
444
它给出了什么:
3332
122411
44
我做错了什么?
正如 Kounis 在评论中所说,Pool
创建了一组用于异步任务处理的进程。此外,Pool.map
的 doc 明确表示处理将是 并行 。
实际上,由于您正在创建一个具有 4 个工作进程的 Pool
,当您 post 4 个元素的 map
时,每个元素都会立即由一个工作进程处理.因此,print x
s 被同时执行。
你的代码没有问题;它完全符合预期。
如果您相信无论什么先执行,它都应该阻止所有其他执行直到完成,这可能会让您感到困惑。值得庆幸的是,这不是真的,因为如果是这样,那就不是并行编程了。您正在启动 4 个并行进程,它们都写入标准输出 (stdout
),而不考虑优先级,因此您创建了某种可以任意解决的竞争条件。
尝试写入 4 个单独的文件而不是 stdout(请参见下面的代码),您会更清楚地看到并行代码的结果;文件是同时而不是连续生成的。
def func1(x):
with open('file_{}'.format(x), w) as f:
f.write(x)
if __name__ == "__main__":
myList = ["111","222","333","444"]
p = Pool(processes=4)
res1 = p.map(func1,myList)