2013-07-12 32 views
1

下面的腳本只是使用多處理從0-9進行計數,其中Thread-1計數偶數,Thread-2計數偶數。請注意,工作人員本身的唯一區別是初始x值爲0和1.有沒有一種方法可以簡化這一點,而不是一遍又一遍地輸入相同的代碼?對於2線程來說並不是什麼大問題,但對於每個不同的起始值,有16個進程(0-16),這會變得非常冗餘。python/multiprocessing:howto簡化「def」字段

#!/usr/bin/python 
from multiprocessing import Process 

def worker1(name): 
    x = 0 
    print name, 'starting...' 
    while x < 10: 
      print x 
      x+=2 
    print name, 'complete!' 

def worker2(name): 
    x = 1 
    print name, 'starting...' 
    while x < 10: 
      print x 
      x+=2 
    print name, 'complete!' 


if __name__ == '__main__': 
    wa = Process(target=worker1, args=('Thread-1',)) 
    wb = Process(target=worker2, args=('Thread-2',)) 

    wa.start() 
    wb.start() 

回答

2

x作爲參數傳遞給worker

import multiprocessing as mp 

def worker(x): 
    name = mp.current_process().name 
    print name, 'starting...' 
    while x < 10: 
      print x 
      x+=2 
    print name, 'complete!' 

if __name__ == '__main__': 
    num_procs = 2 
    procs = [mp.Process(target=worker, args=(x,)) for x in range(num_procs)] 
    for proc in procs: 
     proc.start() 
    for proc in procs: 
     proc.join() 

你不必通過name作爲參數; multiprocessing爲每個進程提供mp.current_process().name可訪問的名稱。如果您確實需要自定義名稱,請使用mp.Process(target=worker, name='custom name', ...)設置名稱。然後可以從worker`mp.current_process().name訪問自定義名稱。

2

您可以通過初始值以及步驟等變量工人:

#!/usr/bin/python 
from multiprocessing import Process 

def worker(name, initial, step=2): 
    x = initial 
    print name, 'starting...' 
    while x < 10: 
      print x 
      x += step 
    print name, 'complete!' 

if __name__ == '__main__': 
    wa = Process(target=worker1, args=('Thread-1', 0)) 
    wb = Process(target=worker2, args=('Thread-2', 1)) 

    wa.start() 
    wb.start()