使用元组的Python多处理无效

时间:2017-07-10 22:36:24

标签: python multiprocessing

我正在尝试Python 3中的多处理,我遇到了一些奇怪的行为(好吧,至少对我来说这很奇怪!)。

基本上,我创建了一个包含10个随机数的列表。然后我遍历一个范围(在我的例子中,它是2),并且对于每次迭代,我使用pool.apply_async并行处理随机数。 “处理”的结果存储在列表中,以便在完成所有处理后,我可以打印结果。我希望看到2 * 10的结果。

然而,我发现,由于某种原因,我只看到2个结果(即我的第一个循环中的2个迭代):

import multiprocessing
import time
import random

class Calculator:

    def calculate(self, links):
        print("LENGHT:", len(links)) # 48
        tups=[]
        for datasetlink in links:
            print(datasetlink)
            tups.append("GO", datasetlink)
        return tups

dslinks = random.sample(range(1, 101), 10)
result_list = []

def Process(datasetlinks):

    calc = Calculator();
    tups = calc.calculate(datasetlinks)
    return tups;

def log_result(result):
    result_list.append(result)

def apply_async_with_callback():
    pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
    for i in range(2):
        pool.apply_async(Process, args = (dslinks,), callback = log_result)
    pool.close()
    pool.join()
    DoPrintResults()

def DoPrintResults():
    for result in result_list:
        print(result)

if __name__ == '__main__':
    start = time.time()
    apply_async_with_callback()
    end = time.time()
    print("Execution took: ", (end-start), " seconds")

如果我从tups=[]函数中移除tups.append("GO", datasetlink)return tupsCalculator.calculate,一切都按预期工作,我看到for-loop Calculator.calculate被击中20次。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

问题在于这一行:

tups.append("GO", datasetlink)

将其更改为:

tups.append(datasetlink)

调试多进程代码可能很棘手。调试它的一种方法是使用异常。将Process中的所有内容放在try块中:

def Process(datasetlinks):
    try:
        calc = Calculator();
        tups = calc.calculate(datasetlinks)
    except:
        print(sys.exc_info()[0])
    return tups;

这给了我<type 'exceptions.NameError'>,当我移动try块来计算:

def calculate(self, links):
    try:
        print("LENGHT:", len(links)) # 48                                                                      
        tups=[]
        for datasetlink in links:
            print(datasetlink)
            tups.append("GO", datasetlink)
    except:
        print(sys.exc_info()[0])
    return tups

我改为<type 'exceptions.TypeError'>