【发布时间】:2017-11-29 13:51:00
【问题描述】:
环境
- GNU/Linux (Fedora 25)。
- Conda 环境。
- Python 3.6.1。
- Numba 0.33.0 (np112py36_0)。
初始设置(工作正常)
main.py 和 numbamodule.py 两个文件:
main.py
这会产生 2 个进程来运行 execute_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_function:
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 中,我只是在最后一个Process 导入之后添加一个建议的(如下)导入(即:取消注释一行并尝试):
import time
from importlib import import_module
from multiprocessing import Process
#
# Adding one of the import lines bellow results in a block...
# (you may need to install the packages first in the virtual environment)
#
#import matplotlib
#import Pyro4
#import scipy
#import dill
def execute_numba(name):
# [...]
然后一个进程可能会在execute_numba 函数处阻塞(特别是在import_module() 调用处):
$ python main.py
1 - executing Numba function...
1 - executing Numba function...
1 - executing Numba function...
1 - executing Numba function...
1 - executing Numba function...
1 - executing Numba function...
[...]
对我来说,matplotlib 和 Pyro4 导入“工作”最好。我什至无法获得 100% 的运行... :-/
请注意,我只是添加了一个导入行,而不是实际使用包。其他一些外部导入也会导致阻塞,但我发现上面提出的那些“工作”最好(阻塞最多)。
发生了什么?
首先,你能重现同样的行为吗? (对非虚拟化 GNU/Linux 机器特别感兴趣)
我不知道如何调试它或为什么会发生这种情况。有什么想法吗?
添加一个随机的import xxx 会触发该块的事实让我感到害怕并且对我来说毫无意义。这是否取决于时间/延迟,这就是为什么有些导入会破坏它而另一些不会?
注意事项
- 如您所见,没有回溯,进程只是阻塞。
- 如果我从
numbamodule.py中删除import numba和@numba.jit,那么它将始终有效,所以也许它与Numba 有关? - 我也可以使用旧 Numba/Python 版本重现相同的行为。尝试使用 Numba 0.25.0 和 0.22.1(都使用 Python 3.5.3)。
更新
- 2017-07-03:为了清楚起见,我不是在寻找解决方法(我已经在实际代码中找到了解决方法)。我真的很想知道如何处理这样的案件。了解正在发生的事情并学习如何调试和查找问题,以便在包/构建/环境损坏时报告问题。您将如何进行?
- 2017-07-10:阻塞尤其发生在
import_module()调用中。 - 2017-07-11:Numba issue acknowledged.
【问题讨论】:
-
我无法在 Windows 10 Python 3.5 Anaconda 安装中重现该错误。但是,如果我不将
import numba放入main.py.,我也无法运行您的代码,您能否重试运行您的代码,进行这个小改动,看看您的错误是否也消失了?不管我之后导入什么,它总是有效的。 -
@Matt 你说“你不能”是什么意思?您是否能够重现相同的行为,或者您实际上是否遇到了异常? (即:您会看到在
stderr上打印的回溯) -
每次无法重现故障时它都有效
-
@Matt 感谢您的反馈。 :-)
-
@jcgiret 是的,你是对的......在此处添加了答案。 :-)