Python 当输入列表超过一定长度时,多处理代码挂起
我一直在玩多处理模块,以便从实现方面获得更好的理解。以下代码执行以下串行和并行方式: 生成一组随机数。每个数字都用作指数函数中的常数。目标是为每个随机数找到一个标量,使指数函数的积分为20 下面的代码似乎有效。但是,一旦Python 当输入列表超过一定长度时,多处理代码挂起,python,multiprocessing,Python,Multiprocessing,我一直在玩多处理模块,以便从实现方面获得更好的理解。以下代码执行以下串行和并行方式: 生成一组随机数。每个数字都用作指数函数中的常数。目标是为每个随机数找到一个标量,使指数函数的积分为20 下面的代码似乎有效。但是,一旦num的值设置为500,代码就会挂起,我不知道为什么。值得一提的是,这是在一台Windows机器上,所有东西都在Spyder中运行 from scipy import optimize as op from scipy.integrate import trapz as intg
num
的值设置为500,代码就会挂起,我不知道为什么。值得一提的是,这是在一台Windows机器上,所有东西都在Spyder中运行
from scipy import optimize as op
from scipy.integrate import trapz as intg
import numpy as np
import multiprocessing as mp
import random
import timeit
import time
def to_solve(a=None, x=None, y=None):
return intg(a*y, x)-20
def worker(lst, x, out_q):
ans = np.zeros(shape=(len(lst), 2))
for i, a in enumerate(lst):
y = func(a=a, x=x)
ans[i,0] = a
ans[i,1] = op.newton(func=to_solve, x0=1, args=(x, y))
out_q.put(ans)
def func(a=None, x=None):
return 1-np.exp(-a*x)
def main_p(nums):
start = timeit.default_timer()
x = np.linspace(0,100)
procs = []
out_q = mp.Queue()
num_procs = 2
step = int(len(nums)/num_procs)
first = 0
last = 0
for i in range(num_procs):
first = last
last = first+step
if i == num_procs-1:
out = nums[first:]
else:
out = nums[first:last]
p = mp.Process(target=worker, args=(out, x, out_q))
procs.append(p)
p.start()
for p in procs:
p.join()
for i in range(len(procs)):
if i == 0:
results = out_q.get()
else:
results = np.vstack((results, out_q.get()))
results = results[results[:,0].argsort()]
print timeit.default_timer() - start
return results
def main_s(nums):
start = timeit.default_timer()
results = np.zeros(shape=(len(nums),2))
x = np.linspace(0,100)
for i, a in enumerate(nums):
results[i,0] = a
y = func(a=a, x=x)
results[i,1] = op.newton(func=to_solve, x0=1, args=(x,y))
results = results[results[:,0].argsort()]
print timeit.default_timer() - start
return results
if __name__ == '__main__':
num = 400
nums = np.random.rand(1,num)
nums = nums.tolist()[0]
a = main_s(nums)
b = main_p(nums)
您放在队列上的对象太大。在为队列提供缓冲区之前,工作进程不会终止,而在父进程从队列读取数据之前,也不会终止,这将在join()之后发生,join()等待->死锁 以下是描述: "" 因此,如果移动循环,问题就会消失
for p in procs:
p.join()
在范围内i的之后(len(procs)):
-循环