多处理:在PyObject中没有错误的NULL结果
这里是我使用多处理的示例程序。 计算是通过multiprocessing.Process
完成的。 multiprocessing.Process
和结果是使用multiprocessing.Queue
收集的。
#THIS PROGRAM RUNS WITH ~40Gb RAM. (you can reduce a,b,c for less RAM
#but then it works for smaller values)
#PROBLEM OCCURS ONLY FOR HUGE DATA.
from numpy import *
import multiprocessing as mp
a = arange(0, 3500, 5)
b = arange(0, 3500, 5)
c = arange(0, 3500, 5)
a0 = 540. #random values
b0 = 26.
c0 = 826.
def rand_function(a, b, c, a0, b0, c0):
Nloop = 100.
def loop(Nloop, out):
res_total = zeros((700, 700, 700), dtype = 'float')
n = 1
while n <= Nloop:
rad = sqrt((a-a0)**2 + (b-b0)**2 + (c-c0)**2)
res_total += rad
n +=1
out.put(res_total)
out = mp.Queue()
jobs = []
Nprocs = mp.cpu_count()
print "No. of processors : ", Nprocs
for i in range(Nprocs):
p = mp.Process(target = loop, args=(Nloop/Nprocs, out))
jobs.append(p)
p.start()
final_result = zeros((700, 700, 700), dtype = 'float')
for i in range(Nprocs):
final_result = final_result + out.get()
p.join()
test = rand_function(a,b,c,a0, b0, c0)
这是错误消息:
Traceback (most recent call last):
File "/usr/lib/python2.7/multiprocessing/queues.py", line 266, in _feed
send(obj)
SystemError: NULL result without error in PyObject_Call
我在这里读到它是一个错误。 但我无法理解。 任何人都可以告诉我任何出路使用多处理来计算大量数据吗?
非常感谢你
错误报告引用说明多处理模块无法将大量参数推送到子进程。
原因是它需要腌制这些参数并将腌制的blob存储在内存中。
但是,您不需要将数组作为参数传递。
可能的原因:
loop
作为目标 mp.Queue()
作为参数 请参阅http://stevenengelhardt.com/2013/01/16/python-multiprocessing-module-and-closures/关于将您的封闭转换为类。
在控制多处理之前设置完整状态。
链接地址: http://www.djcxy.com/p/78403.html上一篇: Multiprocessing : NULL result without error in PyObject
下一篇: Do I have to check the response status in ApplyResponseChallengeAsync?