ins*_*nia 5 python parallel-processing multiprocessing gevent python-2.7
我正在学习如何使我的脚本运行得更快。我认为并行是一个好方法。所以我尝试了 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.]
Run Code Online (Sandbox Code Playgroud)
我发现使用多处理,全局对象a在 fat 中永远不会改变,并且运行后f_para()仍然a是原始数组。跑步的时候f_asy(),就不一样了,a变了。
例2:
def f2(i):
subprocess.call(['./a.out', str(i)])
time.sleep(0.2)
def f2_loop():
for i in xrange(20):
f2(i)
def f2_para():
p=multiprocessing.Pool()
p.map(f2, range(20))
def f2_asy():
threads = [gevent.spawn(f2, i) for i in xrange(20)]
gevent.joinall(threads)
%timeit -n1 f2_loop()
1 loop, best of 3: 4.22 s per loop
%timeit -n1 f2_asy()
1 loop, best of 3: 4.22 s per loop
%timeit -n1 f2_para()
1 loop, best of 3: 657 ms per loop
Run Code Online (Sandbox Code Playgroud)
我发现这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;
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
为什么在例1中,f_para可以改变全局数组的值a?
为什么在ex 2中f2_asy不能并行?
有人知道 gevent 和 multiprocessing 之间的区别吗?如果您愿意解释的话,我将非常感激。
例1:
当您使用多进程时,每个进程都有单独的内存(与线程不同)
例2:
gevent 不创建线程,它创建 Greenlets(协程)!
Greenlet 都在主程序的操作系统进程内部运行,但协同调度。
在任何给定时间只有一个 greenlet 正在运行。
这与多处理或线程库提供的任何真正的并行结构不同,这些库执行由操作系统调度的旋转进程和 POSIX 线程,并且是真正的并行。
| 归档时间: |
|
| 查看次数: |
1698 次 |
| 最近记录: |