奇怪的多处理块导入函数 环境 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.jit
    ,那么它将始终工作,因此可能与numba有关
  • 我也可以在较旧的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