python - python中使用函数multiprocessing.Pool的奇怪结果?
问题描述
这是代码:
一:
import multiprocessing
import datetime
import time
a = [i for i in range(100)]
res1 = []
def jia(a,b,c):
time.sleep(0.1)
return a + b + c
res1_time_start = datetime.datetime.now()
p = multiprocessing.Pool(4)
res1 = [p.apply_async(jia,(i,1,1)) for i in a]
res1 = [i.get() for i in res1]
res1_time_end = datetime.datetime.now()
print((res1_time_end - res1_time_start).seconds)
另一个:
import multiprocessing
import datetime
import time
a = [i for i in range(100)]
res1 = []
def jia(a,b,c):
time.sleep(0.1)
return a + b + c
res1_time_start = datetime.datetime.now()
p = multiprocessing.Pool(4)
for i in a:
res1.append(p.apply_async(jia,(i,1,1)).get())
res1_time_end = datetime.datetime.now()
print((res1_time_end - res1_time_start).seconds)
奇怪的结果是前者花费了 2.5s,而后者花费了 10s。为什么? list.append Blocks 处理吗?
解决方案
不,append()
不会阻塞,但.get()
会阻塞。这就是阻塞的目的。.get()
在
res1 = [p.apply_async(jia,(i,1,1)) for i in a]
res1 = [i.get() for i in res1]
在第二行调用any之前, 所有工作都由第一行提供给池。.get()
但在
for i in a:
res1.append(p.apply_async(jia,(i,1,1)).get())
在.get()
允许循环继续甚至开始下一个工作之前,等待单个工作完成。您已将工作序列化 - 没有任何有用的并行发生。
推荐阅读
- java - 如何修复错误膨胀类 android.support.design.widget.NavigationView
- reactjs - 如何更改 React 的 Material-ui 日期选择器中的图标
- python - numpy中任意函数的逐行广播
- java - 从我的主程序中删除第三方记录器
- excel - 当 Vlookup 导致值发生变化时自动运行宏
- c++ - 试图找到原子加载/存储操作的最大大小
- asp.net-mvc - 发布后特定视图不更新内容
- ruby-on-rails - Rails ActiveModel 使用单类设计 belongs_to 和 has_many
- python - 类变量引用本身?
- javascript - React Hooks 可以有方法吗?