求和2列表的多处理在python中不起作用

alw*_*btc 0 python multiprocessing

和之sum1sum2必须等499500于此代码的末尾,但它打印出来0,为什么?

import multiprocessing

sum1 = 0
sum2 = 0
def list_append_1(out_list):
    global sum1
    for i in out_list:
        sum1 += i
    print "sum1: ", sum1

def list_append_2(out_list):
    global sum2
    for i in out_list:
        sum2 += i
    print "sum2: ", sum2


if __name__ == "__main__":
    lista_1 = [i for i in xrange(500)]# Number of random numbers to add
    lista_2 = [i for i in xrange(500,1000)]
    procs = 2   # Number of processes to create

    # Create a list of jobs and then iterate through
    # the number of processes appending each process to
    # the job list
    jobs = []
    process_1 = multiprocessing.Process(target=list_append_1, args=(lista_1,))
    process_2 = multiprocessing.Process(target=list_append_2, args=(lista_2,))
    jobs.append(process_1)
    jobs.append(process_2)

    # Start the processes (i.e. calculate the random number lists)
    for j in jobs:
        j.start()

    # Ensure all of the processes have finished
    for j in jobs:
        j.join()

    print sum1 + sum2
Run Code Online (Sandbox Code Playgroud)

dan*_*ano 6

发生这种情况是因为您运行的每个任务multiprocessing.Process最终都有自己的变量sum1sum2变量,以及父进程持有的第三个副本.这是使用进程而不是线程的限制之一; 默认情况下,进程之间不共享内存.您可以使用a multiprocessing.Queue将总和发送回父进程来获取总和:

import multiprocessing

def list_append(out_list, q):
    my_sum = sum(out_list)
    print "sum: ", my_sum
    q.put(my_sum)

if __name__ == "__main__":
    lista_1 = [i for i in xrange(500)]# Number of random numbers to add
    lista_2 = [i for i in xrange(500,1000)]
    procs = 2   # Number of processes to create

    # Create a list of jobs and then iterate through
    # the number of processes appending each process to
    # the job list
    jobs = []
    q = multiprocessing.Queue()
    process_1 = multiprocessing.Process(target=list_append, args=(lista_1, q))
    process_2 = multiprocessing.Process(target=list_append, args=(lista_2, q))
    jobs.append(process_1)
    jobs.append(process_2)

    # Start the processes (i.e. calculate the random number lists)
    for j in jobs:
        j.start()

    total = q.get() + q.get()

    # Ensure all of the processes have finished        
    for j in jobs:
        j.join()

    print total
Run Code Online (Sandbox Code Playgroud)

输出:

sum1:  124750
sum2:  374750
499500
Run Code Online (Sandbox Code Playgroud)