gpt4 book ai didi

python - 当输入列表超过一定长度时,多处理代码挂起

转载 作者:太空宇宙 更新时间:2023-11-04 03:03:09 25 4
gpt4 key购买 nike

我一直在研究多处理模块,以便从实现方面获得更好的理解。下面的代码执行以下先串行后并行的方式:

生成一组随机数。每个数字都用作指数函数中的常数。目标是为每个随机数找到使指数函数的积分为 20 所需的标量。

下面的代码似乎有效。但是,一旦 num 的值设置为 500,代码就会挂起,我不知道为什么。对于它的值(value),这是在一台 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)

最佳答案

您放入队列的对象太大。 Th worker process 不会终止,直到为 Queue 提供的缓冲区为空,而这又不会发生,直到父进程从队列中读取,这将发生在等待 -> 死锁的 join() 之后。

这里是描述:“An example which will deadlock is the following.”因此,如果您移动循环,问题就会消失

for p in procs:
p.join()

for i in range(len(procs)): 之后 - 循环。

关于python - 当输入列表超过一定长度时,多处理代码挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40333332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com