进程各自持有一份数据,默认无法共享数据
#!/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>'----->'</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,'----->',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,如需转载请自行联系原作者