Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当输入列表超过一定长度时,多处理代码挂起_Python_Multiprocessing - Fatal编程技术网

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

Python 当输入列表超过一定长度时,多处理代码挂起,python,multiprocessing,Python,Multiprocessing,我一直在玩多处理模块,以便从实现方面获得更好的理解。以下代码执行以下串行和并行方式: 生成一组随机数。每个数字都用作指数函数中的常数。目标是为每个随机数找到一个标量,使指数函数的积分为20 下面的代码似乎有效。但是,一旦num的值设置为500,代码就会挂起,我不知道为什么。值得一提的是,这是在一台Windows机器上,所有东西都在Spyder中运行 from scipy import optimize as op from scipy.integrate import trapz as intg

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

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

下面的代码似乎有效。但是,一旦
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)):
-循环