首页 > 编程 > Python > 正文

探究Python多进程编程下线程之间变量的共享问题

2020-02-23 01:06:18
字体:
来源:转载
供稿:网友

 1、问题:

群中有同学贴了如下一段代码,问为何 list 最后打印的是空值?
 

from multiprocessing import Process, Managerimport os manager = Manager()vip_list = []#vip_list = manager.list() def testFunc(cc):  vip_list.append(cc)  print 'process id:', os.getpid() if __name__ == '__main__':  threads = []   for ll in range(10):    t = Process(target=testFunc, args=(ll,))    t.daemon = True    threads.append(t)   for i in range(len(threads)):    threads[i].start()   for j in range(len(threads)):    threads[j].join()   print "------------------------"  print 'process id:', os.getpid()  print vip_list

其实如果你了解 python 的多线程模型,GIL 问题,然后了解多线程、多进程原理,上述问题不难回答,不过如果你不知道也没关系,跑一下上面的代码你就知道是什么问题了。
 

python aa.pyprocess id: 632process id: 635process id: 637process id: 633process id: 636process id: 634process id: 639process id: 638process id: 641process id: 640------------------------process id: 619[]

将第 6 行注释开启,你会看到如下结果:
 

process id: 32074process id: 32073process id: 32072process id: 32078process id: 32076process id: 32071process id: 32077process id: 32079process id: 32075process id: 32080------------------------process id: 32066[3, 2, 1, 7, 5, 0, 6, 8, 4, 9]

2、python 多进程共享变量的几种方式:
(1)Shared memory:
Data can be stored in a shared memory map using Value or Array. For example, the following code

http://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes
 

from multiprocessing import Process, Value, Array def f(n, a):  n.value = 3.1415927  for i in range(len(a)):    a[i] = -a[i] if __name__ == '__main__':  num = Value('d', 0.0)  arr = Array('i', range(10))   p = Process(target=f, args=(num, arr))  p.start()  p.join()   print num.value  print arr[:]

结果:
 

3.1415927[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

(2)Server process:

A manager object returned by Manager() controls a server process which holds Python objects and allows other processes to manipulate them using proxies.
A manager returned by Manager() will support types list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Queue, Value and Array.
代码见开头的例子。

http://docs.python.org/2/library/multiprocessing.html#managers
3、多进程的问题远不止这么多:数据的同步

看段简单的代码:一个简单的计数器:
 

from multiprocessing import Process, Managerimport os manager = Manager()sum = manager.Value('tmp', 0) def testFunc(cc):  sum.value += cc if __name__ == '__main__':  threads = []   for ll in range(100):    t = Process(target=testFunc, args=(1,))    t.daemon = True    threads.append(t)   for i in range(len(threads)):    threads[i].start()   for j in range(len(threads)):    threads[j].join()   print "------------------------"  print 'process id:', os.getpid()  print sum.value            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表