alw*_*btc 0 python multiprocessing
和之sum1和sum2必须等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)
发生这种情况是因为您运行的每个任务multiprocessing.Process最终都有自己的变量sum1和sum2变量,以及父进程持有的第三个副本.这是使用进程而不是线程的限制之一; 默认情况下,进程之间不共享内存.您可以使用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)