2015-12-31 24 views
3

我正在用python編寫我的第一個多處理程序。Python中的多處理來處理參數列表

我想創建一個要處理的值列表,並且8個進程(數字操作系統CPU核心)將消耗和處理值列表。

我寫了下面的Python代碼:

__author__ = 'Rui Martins' 

from multiprocessing import cpu_count, Process, Lock, Value 

def proc(lock, number_of_active_processes, valor): 
    lock.acquire() 
    number_of_active_processes.value+=1 
    print "Active processes:", number_of_active_processes.value 
    lock.release() 
    # DO SOMETHING ... 
    for i in range(1, 100): 
     valor=valor**2 
    # (...) 
    lock.acquire() 
    number_of_active_processes.value-=1 
    lock.release() 

if __name__ == '__main__': 
    proc_number=cpu_count() 
    number_of_active_processes=Value('i', 0) 
    lock = Lock() 
    values=[11, 24, 13, 40, 15, 26, 27, 8, 19, 10, 11, 12, 13] 
    values_processed=0 

    processes=[] 
    for i in range(proc_number): 
     processes+=[Process()] 
    while values_processed<len(values): 
     while number_of_active_processes.value < proc_number and values_processed<len(values): 
      for i in range(proc_number): 
       if not processes[i].is_alive() and values_processed<len(values): 
        processes[i] = Process(target=proc, args=(lock, number_of_active_processes, values[values_processed])) 
        values_processed+=1 
        processes[i].start() 

      while number_of_active_processes.value == proc_number: 
       # BUG: always number_of_active_processes.value == 8 :(
       print "Active processes:", number_of_active_processes.value 

    print "" 
    print "Active processes at END:", number_of_active_processes.value 

而且,我有以下問題:

  • 該計劃從來沒有停止
  • 我走出RAM enter image description here
+0

丹尼爾桑切斯,我認爲多處理是不同的線程,並且GIL沒有與多處理鎖定。 請參閱:http://stackoverflow.com/questions/3044580/multiprocessing-vs-threading-python?rq=1 –

+0

是的,我只是在發佈我的愚蠢之後想過它,對不起:/ – Netwave

回答

1

簡化您的代碼到以下內容:

def proc(lock, number_of_active_processes, valor): 
    lock.acquire() 
    number_of_active_processes.value += 1 
    print("Active processes:", number_of_active_processes.value) 
    lock.release() 
    # DO SOMETHING ... 
    for i in range(1, 100): 
     print(valor) 
     valor = valor **2 
    # (...) 
    lock.acquire() 
    number_of_active_processes.value -= 1 
    lock.release() 


if __name__ == '__main__': 
    proc_number = cpu_count() 
    number_of_active_processes = Value('i', 0) 

    lock = Lock() 
    values = [11, 24, 13, 40, 15, 26, 27, 8, 19, 10, 11, 12, 13] 
    values_processed = 0 

    processes = [Process() for _ in range(proc_number)] 
    while values_processed < len(values)-1: 
     for p in processes: 
      if not p.is_alive(): 
       p = Process(target=proc, 
          args=(lock, number_of_active_processes, values[values_processed])) 
       values_processed += 1 
       p.start() 

如果你運行它像上面的print(valor)加入你看看到底發生了什麼,你正在成倍增長,勇氣給你耗盡內存的時候,你不要陷在您遇到的,而for循環。

這是在第12屆過程幾分之一秒後加入print(len(srt(valor)))輸出,它只是不斷去:

2 
3 
6 
11 
21 
......... 
59185 
70726 
68249 
73004 
77077 
83805 
93806 
92732 
90454 
104993 
118370 
136498 
131073 

只需改變你的循環以下幾點:

for i in range(1, 100): 
    print(valor) 
    valor = valor *2 

最後創建的號碼是:

6021340351084089657109340225536 

使用你自己的代碼,你似乎得到st科軍在一段時間,但它是勇敢,在爲不斷增長的for循環數與儘可能多的數字:

167609 
180908 
185464 
187612 
209986 
236740 
209986 

而上....

+0

嗨,謝謝,但我認爲你不能改變代碼,因爲你的代碼使用超過8個進程,因爲當你執行「p = Process(...「,您的將創建並啓動一個新的進程,但不會替換原始列表os進程中的」p「,並且」if if not p.is_alive()「所有時間將返回」True「。 示例: lista = range (15) 打印LISTA 對於L在LISTA: 打印升 L = 0 打印LISTA –

+0

對不起,我不說英語非常好,但在我的代碼只運行8個進程(在同一時間),並在你運行的代碼是13(因爲是「值」的大小)問題是你的代碼是正確的,但是我需要每個進程儘可能快,然後我只運行8個進程,每個進程都有一個進程值,每當一個過程完成,我運行一個新的,直到每個值處理。感謝您的幫助:)真的你有最好的答案 –

+1

@RuiMarti ns,'processes = [process()for _in range(proc_number)]',並且循環遍歷進程列表與您的代碼中的索引邏輯完全相同,您可以使用枚舉索引來處理[我] =進程'http://pastebin.com/ksQbvMET –

0

的問題是不是你的多碼。它在戰俘操作for循環:

for i in range(1, 100): 
     valor=valor**2 

最終的結果將是POW(VAL,2 ** 100),這是太大,並計算出它會花費太多的時間和內存。所以你在最後失去了內存錯誤。

4 GB = 4 * pow(2, 10) * pow(2, 10) * pow(2, 20) * 8 bit = 2**35 bit 

,併爲您的最小號碼8:

pow(8, 2**100) = pow(2**3, 2**100) = pow(2, 3*pow(2, 100)) 
pow(2, 3*pow(2, 100))bit/4GB = 3*pow(2, 100-35) = 3*pow(2, 65) 

它需要3 * POW(2 65)的4 GB內存倍。