1

我試圖運行以下代碼段,它將數據附加到列表'tests1'和'tests2'。但是當我打印'tests1'和'tests2'時,顯示的列表是空的。這裏有什麼不正確的?並行化2 for循環時無法獲取值

tests1 = [] 
tests2 = [] 

def func1(): 
    for i in range(25,26): 
     tests1.append(test_loader.get_tests(test_prefix=new_paths[i],tags=params.get('tags', None), 
            exclude=params.get('exclude', False))) 

def func2(): 
    for i in range(26,27): 
     tests2.append(test_loader.get_tests(test_prefix=new_paths[i],tags=params.get('tags', None), 
            exclude=params.get('exclude', False))) 


p1 = mp.Process(target=func1) 
p2 = mp.Process(target=func2) 

p1.start() 
p2.start() 
p1.join() 
p2.join() 

print tests1 
print tests2 

回答

0

工作進程實際上並不共享同一個對象。它被複制(醃製)。

您可以使用multiprocessing.Queue(或通過各種其他方式)在進程之間發送值。看看我的簡單例子(爲了簡單起見,我把你的測試整理成整數)。

from multiprocessing import Process, Queue 

def add_tests1(queue): 
    for i in range(10): 
     queue.put(i) 
    queue.put(None) 

def add_tests2(queue): 
    for i in range(100,110): 
     queue.put(i) 
    queue.put(None) 

def run_tests(queue): 
    while True: 
     test = queue.get() 
     if test is None: 
      break 
     print test 

if __name__ == '__main__': 
    queue1 = Queue() 
    queue2 = Queue() 

    add_1 = Process(target = add_tests1, args = (queue1,)) 
    add_2 = Process(target = add_tests2, args = (queue2,)) 
    run_1 = Process(target = run_tests, args = (queue1,)) 
    run_2 = Process(target = run_tests, args = (queue2,)) 

    add_1.start(); add_2.start(); run_1.start(); run_2.start() 
    add_1.join(); add_2.join(); run_1.join(); run_2.join() 

請注意,父程序也可以訪問隊列。

+0

像這樣工作會拋出此錯誤:Traceback(最近調用最後一次): 文件「/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/queues.py」,行268,in _feed send(obj) PicklingError:不能pickle :屬性查找__builtin __。instancemethod失敗 – Aditya

+0

@Aditya它通過酸洗和取消添加到隊列中的對象以在進程之間發送它們。 Pickle不接受功能。可能你可以傳回一個完整的對象而不是一個方法,但是不知道'test_loader.get_tests'的更多細節,我無法確定。在我的簡單示例中,如果您將整數包裝到類中併發回可用的類實例,但是如果您發回實例方法,它將失敗並出現類似的錯誤。 – aes