用python压缩输出和多处理

2024-10-04 01:36:01 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我已经用numpy和multiprocessing写了一段时间的数值。它工作正常,但我收集结果有困难。我用下面的方法来完成,我用一个队列作为输入,一个队列作为输出。程序从输入队列读取参数,对其进行处理,然后将结果放入输出队列。稍后,在主进程中,我从队列中读取它并对其进行pickle处理。像这样:

def fun(inp,outp):
    while True:
        try:
            params = inp.get(block=False)
            results = runprocess(params)
            out.put(results,block=False)
        except Empty:
            break

稍后在主循环中,我将执行以下操作:

^{pr2}$

但不知何故,总会有两种情况发生:要么pickle是空的,要么进程挂起并保持运行,使用0%的cpu(一开始它们会上升到100%,基本上是数字运算)。你觉得我做错什么了吗?在

好吧,我重新做了一遍池.map(). 为了让大家都知道我是怎么做到这一点的:

    ncpus = mp.cpu_count()
    out = dict()

    params = [(a,p) for p in np.arange(0.0,2.0,0.1) for a in np.arange(0.001,2.0,0.1)]

    pool = mp.Pool(processes=ncpus)
    results = pool.map(runm,params)

    for i in results:
            sigs = np.zeros((order,order))
            sigsmf = np.zeros((order,order))
            sigseq = np.zeros((order,order))
            xs = np.array([])
            freqs = np.array([])
            [(a,p),sigs[:,:],sigsmf[:,:],sigseq[:,:],xs,freqs] = i
            out[(a,p)] = [sigs[:,:],sigsmf[:,:],sigseq[:,:],xs,freqs]
            print a, p, sigs[0,0]

工作起来很有魅力,更容易实现!在

谢谢费迪南德!我不知道该怎么做,但我想我们现在可以结束这个问题了!在


Tags: infor队列进程npzerosorderparams
2条回答

您至少需要在get调用中放入timeout,并删除{}。在您当前的配置中,如果在调用get时没有可用的项,您将得到Empty异常,并跳出循环。如果您依赖于另一个线程来填充该队列,但它没有及时填充它,那么它将过早地退出循环并产生一个空结果。同样,由于队列已满,put可能会挂起,从而挂起程序。在

所以,用这样的方法:

params = inp.get(timeout=1)
out.put(timeout=1)

因为你有block=False。当收集器试图从队列中获取数据时,它不会立即在队列中找到数据。因此,引发空异常并将其跳出循环

从输入列表中获取数据时,可以指定block=False作为它的预填充列表。但是,输出队列是在运行时生成的。因此,当您试图从中获取数据时,它可能是空的,因为输入过程需要更长的时间来处理。在

如果知道输入队列的长度,那么可以尝试无限期地阻塞输出队列qet。如果没有,我建议你暂停一下。在

相关问题 更多 >