我正在学习如何使我的脚本运行得更快。我认为平行是个好方法。所以我尝试了gevent和多处理。但我被不同的结果弄糊涂了。我来举两个例子
例1:
a=np.zeros([3])
def f(i):
a[i]=1
print a
def f_para():
p=multiprocessing.Pool()
p.map(f, range(3))
def f_asy():
threads = [gevent.spawn(f, i) for i in xrange(3)]
gevent.joinall(threads)
f_para()
[ 0. 1. 0.]
[ 0. 0. 1.]
[ 1. 0. 0.]
f_asy()
[ 1. 0. 0.]
[ 1. 1. 0.]
[ 1. 1. 1.]
我发现使用多处理时,全局对象a
在fat中永远不变,运行f_para()
,a
仍然是原始数组。当运行f_asy()
时,它是不同的,a
发生了变化。在
例2:
^{pr2}$我发现f2_asy()
不会减少运行时间。而且f2_asy()
的输出是一个接一个的,就像f2_loop()
一样,所以我认为f2_asy()
中没有并行。在
a.out
是一个简单的c++代码:
#include <iostream>
int main(int argc, char* argv[])
{
std::cout<<argv[1]<<std::endl;
return 0;
}
所以我的问题是:
为什么在ex1中,f_para
可以更改全局数组a
的值?
为什么在ex2中,f2_asy
不能并行?
有人知道gevent和多处理之间的区别吗?如果你愿意解释,我非常感激。在
示例1:
使用多进程时,每个进程都有独立的内存(与线程不同)
示例2:
gevent不创建线程,它创建Greenlets(协程)!在
相关问题 更多 >
编程相关推荐