奇怪的多处理块导入函数 环境 GNU/Linux(Fedora25) 康达环境 Python 3.6.1 Numba 0.33.0(np112py36_0) 初始设置(工作正常)
两个文件奇怪的多处理块导入函数 环境 GNU/Linux(Fedora25) 康达环境 Python 3.6.1 Numba 0.33.0(np112py36_0) 初始设置(工作正常),python,numba,Python,Numba,两个文件main.py和numbamodule.py: main.py 这会产生两个进程来运行execute\u numba函数 import time from importlib import import_module from multiprocessing import Process def execute_numba(name): # Import the function importfunction = 'numbamodule.numba_function
main.py
和numbamodule.py
:
main.py
这会产生两个进程来运行execute\u numba
函数
import time
from importlib import import_module
from multiprocessing import Process
def execute_numba(name):
# Import the function
importfunction = 'numbamodule.numba_function'
module = import_module(importfunction.split('.')[0])
function = getattr(module, importfunction.split('.')[-1])
while True:
print(str(name) + ' - executing Numba function...')
# Execute the function
function(10)
time.sleep(0.1)
if __name__ == '__main__':
processes = [Process(target=execute_numba, args=(i,)) for i in range(2)]
[p.start() for p in processes]
time.sleep(1)
[p.terminate() for p in processes]
numbamodule.py
定义了一个简单函数numba\u函数
:
import numba
@numba.jit()
def numba_function(x):
total = 0
for i in range(x):
total += i
return total
我可以运行main.py
脚本并查看两个进程的打印:
$ python main.py
0 - executing Numba function...
1 - executing Numba function...
0 - executing Numba function...
1 - executing Numba function...
0 - executing Numba function...
1 - executing Numba function...
[...]
打破它
我打破它的方式有点奇怪,但这正是我在尝试最小化可复制的测试用例时偶然发现的。请告诉我你是否也能复制同样的行为
在main.py
中,我只需在最后一个过程
导入之后添加一个建议的(下面的)导入(即:取消注释一行并重试):
然后一个进程可能会在execute\u numba
函数处阻塞(特别是在import\u module()
调用处):
对我来说,matplotlib
和Pyro4
导入的“工作”效果最好。我甚至无法在100%的跑步中获得拦网-/
请注意,我只是添加了一个导入行,而不是实际使用包。其他一些外部导入也会导致阻塞,但我发现上面建议的那些“工作”最好(阻塞最多)
发生了什么事?
首先,你能重现同样的行为吗?(特别对非虚拟化GNU/Linux机器感兴趣)
我不知道如何调试,也不知道为什么会发生这种情况。有什么想法吗
添加一个随机import xxx
触发块的事实让我感到害怕,对我来说没有什么意义。这是否取决于时间/延迟,这就是为什么一些进口打破了它,而另一些则没有
笔记
- 正如您所看到的,没有回溯,过程只是阻塞
- 如果我从
中删除numbamodule.py
和import numba
,那么它将始终工作,因此可能与numba有关@numba.jit
- 我也可以在较旧的Nuba/Python版本中复制相同的行为。尝试使用Numba 0.25.0和0.22.1(都使用Python 3.5.3)
- 2017-07-03:我只是想澄清一下,我不是在寻找解决办法(我已经在真实代码中找到了一个)。我真的很想知道在这种情况下如何处理。了解发生了什么,并了解如何调试和发现问题,以便在包/构建/环境损坏时报告问题。你将如何进行
- 2017-07-10:阻塞尤其发生在
调用中import\u module()
- 2017-07-11:
- 这里是官方Python Docker环境的复制品<代码>Dockerfile如下(将您的
.py
文件放在一起)
然后:
docker build -t so-44764520 .
docker run --rm -it so-44764520
两者的工作方式相同,没有“工作”导入,
matplotlib
和Pyro4
,并且在main.py
中使用它们 这只适用于matplotlib调试,实际上是猜测,但可能有助于缩小问题范围
当包含matplotlib时,可以使用以下命令启动程序:
python main.py --verbose-helpful
这将显示matplotlib初始化时的调试输出。由于这听起来像是一个仅在您的特定系统上存在的问题,matplotlibrc的配置方式可能会导致在交互模式下启动时出现一些配置问题
以下是可用调试模式的概述:
这似乎是一个麻木虫,在年被承认 现在看来已经修好了。如果遇到此问题,请更新
numba
和llvmlite
安装。如果这不能解决问题,您可能应该在该问题中添加注释以重新打开它
正如@stuartarchibald所评论的:
[…]看起来一个已处理的被阻止是因为它实际上已发生故障[…]
[…]从这个位置出现的Segfaults几乎总是由于线程在LLVM内执行并发操作,或者在Numba的初始化过程中与安装函数有关的一些问题。[……]
[…]无法使用llvmlite==0.22.0dev0
和numba==0.37.0.dev
[…]
谢谢如果其他人不想使用Conda/virtualenv,那么这可能有助于他们尝试重现错误。然而,它仍然有很多问题有待解决。^^我自己无法使用Docker复制它,但主要问题仍然存在:当阻塞发生时会发生什么以及如何解决它?如果不知道这个问题的答案,我们就不能说Docker解决了这个问题。也许这只是一个偶然的机会,因为这种情况对微小的更改非常敏感(例如:简单地在代码中添加一个导入行就会破坏它)。是的,答案的关键是要证明它在正式环境中工作,并且看起来不值得在代码中查找Python错误。此外,它还表明您的环境或conda发行版的某些版本可能以某种方式被破坏。重新安装或其他版本可能会有所帮助。否则,您可以使用Docker或其他环境,因为没有证据表明它不能解决问题(或作为一种解决方法)。是的,您已经尝试重新安装并更改了Python/Numba版本,但没有成功(如问题说明中所述)。在这一点上,抛弃当前的环境,与Docker合作是不可能的。所以这个问题仍然需要一个答案:在这种情况下该怎么办?如何调试和发现问题?(例如:如果有什么东西坏了:它是什么?这样我就可以报告或修复它)基本上,如果我想确保Docker(或其他任何东西)修复了问题,我首先需要知道问题是什么。如果有什么东西坏了,我宁愿找到它并报告,因为我有一个复制它的环境我
FROM python:3.5
RUN pip install numba matplotlib pyro4
ADD . /opt
WORKDIR /opt
CMD python main.py
docker build -t so-44764520 .
docker run --rm -it so-44764520
python main.py --verbose-helpful