python(33)多進程和多線程的區別

來源:互聯網
上載者:User

標籤:不同   http   修改   rgs   start   情況   thread   共用記憶體   imp   

多線程可以共用全域變數,多進程不能。多線程中,所有子線程的進程號相同;多進程中,不同的子進程進程號不同。

#!/usr/bin/python# -*- coding:utf-8 -*-import osimport threadingimport multiprocessingcount_thread = 0count_process = 0 # worker functiondef worker1(sign, lock):    global count_thread    lock.acquire()    count_thread += 1    print(sign, os.getpid())    lock.release() def worker2(sign, lock):    global count_process    lock.acquire()    count_process += 1    print(sign, os.getpid())    lock.release()# Mainprint(‘Main:‘,os.getpid()) # Multi-threadrecord = []lock  = threading.Lock()for i in range(5):    thread = threading.Thread(target=worker1,args=(‘thread‘,lock))    thread.start()    record.append(thread) for thread in record:    thread.join() # Multi-processrecord = []lock = multiprocessing.Lock()for i in range(5):    process = multiprocessing.Process(target=worker2,args=(‘process‘,lock))    process.start()    record.append(process) for process in record:    process.join()  print count_threadprint count_process

 

運行結果

(‘Main:‘, 3142)
(‘thread‘, 3142)
(‘thread‘, 3142)
(‘thread‘, 3142)
(‘thread‘, 3142)
(‘thread‘, 3142)
(‘process‘, 3148)
(‘process‘, 3149)
(‘process‘, 3150)
(‘process‘, 3151)
(‘process‘, 3152)
5
0

應該盡量避免多進程共用資源。多進程共用資源必然會帶來進程間相互競爭。而這種競爭又會造成race condition,我們的結果有可能被競爭的不確定性所影響。但如果需要,我們依然可以通過共用記憶體和Manager對象這麼做。

1) 共用記憶體

用Python實現的例子:

import multiprocessing def f(n, a):    n.value   = 3.14    a[0]      = 5 num   = multiprocessing.Value(‘d‘, 0.0)arr   = multiprocessing.Array(‘i‘, range(10)) p = multiprocessing.Process(target=f, args=(num, arr))p.start()p.join() print num.valueprint arr[:]

 

這裡我們實際上只有主進程和Process對象代表的進程。我們在主進程的記憶體空間中建立共用的記憶體,也就是Value和Array兩個對象。對象Value被設定成為雙精確度數(d), 並初始化為0.0。而Array則類似於C中的數組,有固定的類型(i, 也就是整數)。在Process進程中,我們修改了Value和Array對象。回到主程式,列印出結果,主程式也看到了兩個對象的改變,說明資源確實在兩個進程之間共用。

2)Manager

Manager對象類似於伺服器與客戶之間的通訊 (server-client),與我們在Internet上的活動很類似。我們用一個進程作為伺服器,建立Manager來真正存放資源。其它的進程可以通過參數傳遞或者根據地址來訪問Manager,建立串連後,動作伺服器上的資源。在防火牆允許的情況下,我們完全可以將Manager運用於多電腦,從而模仿了一個真實的網路情境。下面的例子中,我們對Manager的使用類似於shared memory,但可以共用更豐富的物件類型。

import multiprocessing def f(x, arr, l):    x.value = 3.14    arr[0] = 5    l.append(‘Hello‘) server = multiprocessing.Manager()x    = server.Value(‘d‘, 0.0)arr  = server.Array(‘i‘, range(10))l    = server.list() proc = multiprocessing.Process(target=f, args=(x, arr, l))proc.start()proc.join() print(x.value)print(arr)print(l)

 

Manager利用list()方法提供了表的共用方式。實際上你可以利用dict()來共用詞典,Lock()來共用threading.Lock(注意,我們共用的是threading.Lock,而不是進程的mutiprocessing.Lock。後者本身已經實現了進程共用)等。 這樣Manager就允許我們共用更多樣的對象。

參考資料:

http://blog.csdn.net/zhaozhi406/article/details/8137670

http://www.xuebuyuan.com/1968817.html

python(33)多進程和多線程的區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.