python-進程之間的數據共享

********進程之間的數據共享********(瞭解)

展望將來,基於消息傳遞的併發編程是大勢所趨

即使是使用線程,推薦作法也是將程序設計爲大量獨立的線程集合,經過消息隊列交換數據。

這樣極大地減小了對使用鎖定和其餘同步手段的需求,還能夠擴展到分佈式系統中。

但進程間應該儘可能避免通訊,即使須要通訊,也應該選擇進程安全的工具來避免加鎖帶來的問題。

之後嘗試使用數據庫來解決如今進程之間的數據共享問題。


Manager模塊介紹

進程間數據是獨立的,能夠藉助於隊列或管道實現通訊,兩者都是基於消息傳遞的
雖然進程間數據獨立,但能夠經過Manager實現數據共享,事實上Manager的功能遠不止於此

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, Barrier, Queue, Value and 
Array.



from multiprocessing import Manager, Process, Lock


def work(num0, num1, lock):
    lock.acquire()  # 不加鎖而操做共享的數據,確定會出現數據錯亂
    num0[1] -= 1
    num1['name'] = 'Tom'
    lock.release()
    print('子進程中的num0值是', num0)
    print('子進程中的num0值是', num1)


if __name__ == '__main__':
    lock = Lock()
    m = Manager()
    num0 = m.list([1, 6, 3, 4])  # `dict`, `list` and `Namespace`
    num1 = m.dict({'name': 'Jack'})
    p = Process(target=work, args=(num0, num1, lock))
    p.start()
    p.join()
    print('主進程中的num0值是', num0)
    print('主進程中的num1值是', num1)

=================================================================

from multiprocessing import Manager, Process, Lock


def work(d, lock):
    with lock:  # 不加鎖而操做共享的數據,確定會出現數據錯亂
        d['count'] -= 1


if __name__ == '__main__':
    lock = Lock()
    with Manager() as m:
        dic = m.dict({'count': 100})
        p_l = []
        for i in range(100):
            p = Process(target=work, args=(dic, lock))
            p_l.append(p)
            p.start()
        for p in p_l:
            p.join()
        print(dic)

===================================================================

Value模塊數據貢獻的例子


from multiprocessing import Process,Value,Lock
import time


def get_money(num,l):# 取錢
    l.acquire()# 拿走鑰匙,鎖上門,不容許其餘人進屋
    for i in range(100):
        num.value -= 1
        print(num.value)
        time.sleep(0.01)
    l.release()# 還鑰匙,打開門,容許其餘人進屋

def put_money(num,l):# 存錢
    l.acquire()
    for i in range(100):
        num.value += 1
        print(num.value)
        time.sleep(0.01)
    l.release()

if __name__ == '__main__':
    num = Value('i',100)
    l = Lock()
    p = Process(target=get_money,args=(num,l))
    p.start()
    p1 = Process(target=put_money, args=(num,l))
    p1.start()
    p.join()
    p1.join()
    print(num.value)
相關文章
相關標籤/搜索