Python多处理块侍者。获取()

2024-10-01 17:38:08 发布

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

有人能解释一下为什么这个代码会阻塞而不能完成吗?在

我遵循了multiprocessing的几个示例,并编写了一些非常相似的代码,这些代码不会被阻塞。但是,显然,我看不出工作代码和下面的代码有什么区别。我想一切都很好。它一直到达.get(),但没有一个进程完成。在

问题是python3无限期地阻塞侍者。获取(),你可以通过打断它并阅读回溯来判断。在

$ python3 ./try415.py
^CTraceback (most recent call last):
  File "./try415.py", line 43, in <module>
    ps = [ res.get() for res in proclist ]
  File "./try415.py", line 43, in <listcomp>
    ps = [ res.get() for res in proclist ]
  File "/usr/lib64/python3.6/multiprocessing/pool.py", line 638, in get
    self.wait(timeout)
  File "/usr/lib64/python3.6/multiprocessing/pool.py", line 635, in wait
    self._event.wait(timeout)
  File "/usr/lib64/python3.6/threading.py", line 551, in wait
    signaled = self._cond.wait(timeout)
  File "/usr/lib64/python3.6/threading.py", line 295, in wait
    waiter.acquire()
keyboardInterrupt

这是密码

^{pr2}$

Tags: 代码inpyselfgetusrlinetimeout
2条回答

缩进

在那之后,我只是没有意识到有些代码不在with子句中。(除了一些打字错误和其他错误,我现在已经修复了。)Intermezzo又来了!在

感谢斯诺让我以不同的方式经历,直到我发现自己的错误。我只是不清楚我打算做什么。斯诺伊的颂歌是一个完全有效的等效代码。然而,根据记录,timeout不是必需的。而且,更重要的是,with对于Process是完全有效的,如果正确地使用它,如Python3.6.6multiprocessing文档的第一段所示,这也是我得到它的地方。不知怎么的,我把事情搞砸了。我想写的代码很简单:

with Pool(processes=numParallelProcesses) as pool:
    proclist = [ pool.apply_async(fitWithErr, args) for args in trialParameterList ]

    ps = [ res.get() for res in proclist ]
    ps = np.array(ps)
    mean_pfit = np.mean(ps,0)

工作和我预想的一样。在

很抱歉给错了答案。不核实是不负责任的。这是我的答案。在

with Pool(processes=numParallelProcesses) as pool:

此行错误,因为will callexit函数未关闭。以下是退出函数体:

^{pr2}$

所有进程将被终止,并且永远不会执行。 代码:

ps = [ res.get() for res in proclist ]

没有超时参数。下面是get函数体:

def get(self, timeout=None):
    self.wait(timeout)
    if not self.ready():
        raise TimeoutError
    if self._success:
        return self._value
    else:
        raise self._value

如果没有超时,它将一直等待。这就是它挂起来的原因。在

你需要改变

with Pool(processes=numParallelProcesses) as pool:
    proclist = [ pool.apply_async(fitWithErr, args) for args in trialParameterList ]

收件人:

pool=Pool(processes=numParallelProcesses)
proclist = [ pool.apply_async(fitWithErr, args) for args in trialParameterList ]
pool.close()

相关问题 更多 >

    热门问题