gevent与多进程的区别

2024-09-28 23:39:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习如何使我的脚本运行得更快。我认为平行是个好方法。所以我尝试了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;
 }

所以我的问题是:

  1. 为什么在ex1中,f_para可以更改全局数组a的值?

  2. 为什么在ex2中,f2_asy不能并行?

有人知道gevent和多处理之间的区别吗?如果你愿意解释,我非常感激。在


Tags: 方法脚本defgevent数组全局例子int
1条回答
网友
1楼 · 发布于 2024-09-28 23:39:16

示例1:

使用多进程时,每个进程都有独立的内存(与线程不同)

示例2:

gevent不创建线程,它创建Greenlets(协程)!在

Greenlets all run inside of the OS process for the main program but are scheduled cooperatively.

Only one greenlet is ever running at any given time.

This differs from any of the real parallelism constructs provided by multiprocessing or threading libraries which do spin processes and POSIX threads which are scheduled by the operating system and are truly parallel.

相关问题 更多 >