天天看点

进程数据共享

进程各自持有一份数据,默认无法共享数据

#!/usr/bin/env python

#coding:utf-8

from multiprocessing import Process

from multiprocessing import Manager

import time

li = []

def foo(i):

    li.append(i)

    print 'say hi',li

for i in range(10):

    p = Process(target=foo,args=(i,))

    p.start()

print 'ending',li

为了解决进程之间的数据共享问题,可以使用如下方法:

<code>#方法一,Array</code>

<code>from</code> <code>multiprocessing </code><code>import</code> <code>Process,Array</code>

<code>temp </code><code>=</code> <code>Array(</code><code>'i'</code><code>, [</code><code>11</code><code>,</code><code>22</code><code>,</code><code>33</code><code>,</code><code>44</code><code>])</code>

<code>def</code> <code>Foo(i):</code>

<code>    </code><code>temp[i] </code><code>=</code> <code>100</code><code>+</code><code>i</code>

<code>    </code><code>for</code> <code>item </code><code>in</code> <code>temp:</code>

<code>        </code><code>print</code> <code>i,</code><code>'-----&gt;'</code><code>,item</code>

<code>for</code> <code>i </code><code>in</code> <code>range</code><code>(</code><code>2</code><code>):</code>

<code>    </code><code>p </code><code>=</code> <code>Process(target</code><code>=</code><code>Foo,args</code><code>=</code><code>(i,))</code>

<code>    </code><code>p.start()</code>

<code>#方法二:manage.dict()共享数据</code>

<code>from</code> <code>multiprocessing </code><code>import</code> <code>Process,Manager</code>

<code>manage </code><code>=</code> <code>Manager()</code>

<code>dic </code><code>=</code> <code>manage.</code><code>dict</code><code>()</code>

<code>    </code><code>dic[i] </code><code>=</code> <code>100</code><code>+</code><code>i</code>

<code>    </code><code>print</code> <code>dic.values()</code>

<code>    </code><code>p.join()</code>

类型对应表:

当创建进程时(非使用时),共享数据会被拿到子进程中,当进程中执行完毕后,再赋值给原值。

进程锁实例

# -*- coding:utf-8 -*-

from multiprocessing import Process, Array, RLock

def Foo(lock,temp,i):

    """

    将第0个数加100

    lock.acquire()

    temp[0] = 100+i

    for item in temp:

        print i,'-----&gt;',item

    lock.release()

lock = RLock()

temp = Array('i', [11, 22, 33, 44])

for i in range(20):

    p = Process(target=Foo,args=(lock,temp,i,))

进程池

     进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。

进程池中有两个方法:

apply

apply_async

<code>#!/usr/bin/env python</code>

<code># -*- coding:utf-8 -*-</code>

<code>from</code>  <code>multiprocessing </code><code>import</code> <code>Process,Pool</code>

<code>import</code> <code>time</code>

<code> </code> 

<code>    </code><code>time.sleep(</code><code>2</code><code>)</code>

<code>    </code><code>return</code> <code>i</code><code>+</code><code>100</code>

<code>def</code> <code>Bar(arg):</code>

<code>    </code><code>print</code> <code>arg</code>

<code>pool </code><code>=</code> <code>Pool(</code><code>5</code><code>)</code>

<code>#print pool.apply(Foo,(1,))</code>

<code>#print pool.apply_async(func =Foo, args=(1,)).get()</code>

<code>for</code> <code>i </code><code>in</code> <code>range</code><code>(</code><code>10</code><code>):</code>

<code>    </code><code>pool.apply_async(func</code><code>=</code><code>Foo, args</code><code>=</code><code>(i,),callback</code><code>=</code><code>Bar)</code>

<code>print</code> <code>'end'</code>

<code>pool.close()</code>

<code>pool.join()</code><code>#进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。</code>

      本文转自027ryan  51CTO博客,原文链接:http://blog.51cto.com/ucode/1766259,如需转载请自行联系原作者