国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

探究Python多進程編程下線程之間變量的共享問題

2020-02-23 01:06:18
字體:
供稿:網(wǎng)友

 1、問題:

群中有同學(xué)貼了如下一段代碼,問為何 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 問題,然后了解多線程、多進程原理,上述問題不難回答,不過如果你不知道也沒關(guān)系,跑一下上面的代碼你就知道是什么問題了。
 

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 行注釋開啟,你會看到如下結(jié)果:
 

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[:]

結(jié)果:
 

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、多進程的問題遠不止這么多:數(shù)據(jù)的同步

看段簡單的代碼:一個簡單的計數(shù)器:
 

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            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 巴楚县| 辽阳县| 芷江| 齐河县| 鄄城县| 崇文区| 永宁县| 巫山县| 富阳市| 邵阳市| 思南县| 闸北区| 都兰县| 济南市| 古蔺县| 呼玛县| 通河县| 临夏市| 静安区| 南岸区| 榆树市| 长岛县| 兰考县| 宾川县| 西城区| 水富县| 公主岭市| 隆子县| 兴海县| 贵溪市| 茂名市| 桃江县| 普定县| 金华市| 金门县| 隆林| 鄂州市| 叙永县| 甘谷县| 辉南县| 长春市|