【问题标题】:Multithreaded Flask application causes stack error in rpy2 R process多线程 Flask 应用程序导致 rpy2 R 进程中的堆栈错误
【发布时间】:2020-09-07 23:51:13
【问题描述】:

与此处的错误基本相同,但这些解决方案没有提供足够的信息来复制工作示例:Rpy2 in a Flask App: Fatal error: unable to initialize the JIT

在我的 Flask 应用程序中,使用 rpy2.rinterface 模块,每当我初始化 R 时,我都会收到相同的堆栈使用错误:

import rpy2.rinterface as rinterface 
from rpy2.rinterface_lib import openrlib

with openrlib.rlock: 
    rinterface.initr()

Error: C stack usage 664510795892 is too close to the limit Fatal error: unable to initialize the JIT

rinterface 是 rpy2 中的低级 R 钩子,但更高级别的 robjects 模块给出了相同的错误。我尝试将上下文锁和 R 初始化包装在来自多处理模块的 Process 中,但有同样的问题。文档说多线程环境会给 R 带来问题:https://rpy2.github.io/doc/v3.3.x/html/rinterface.html#multithreading 但是上下文管理器似乎并没有阻止与 R

接口的问题

【问题讨论】:

    标签: r multithreading flask rpy2


    【解决方案1】:

    rlock 是 Python 的 threading.Rlock 的一个实例。它应该处理多线程问题。

    但是,如果嵌入式 R 在子进程之间共享,多重处理可能会导致类似的问题。此演示脚本的代码显示了 R 和 Python 进程的并行处理说明了这一点:https://github.com/rpy2/rpy2/blob/master/doc/_static/demos/multiproc_lab.py

    我认为解决这个问题的方法是配置 Flask,或者很可能是您的 wsgi 层,以创建独立的子进程,或者让您的所有 Flask 进程将 R 计算委托给辅助进程(动态创建,或在等待任务执行的进程池)。

    【讨论】:

      【解决方案2】:

      正如其他类似问题的答案所暗示的那样,Flask 用户需要在 WSGI 上下文之外初始化和运行 rpy2,以防止嵌入式 R 进程崩溃。我使用 Celery 实现了这一点,其中工作人员提供了一个独立于 Flask 的环境来处理在 R 中发出的请求。

      我使用问题中提到的低级 rinterface 库,并使用类编写 Celery 任务

      import rpy2.rinterface as rinterface
      from celery import Celery
      
      celery = Celery('tasks', backend='redis://', broker='redis://')
      
      class Rpy2Task(Task):   
          def __init__(self):
              self.name = "rpy2"
      
          def run(self, args):    
              rinterface.initr()
              r_func = rinterface.baseenv['source']('your_R_script.R')
              r_func[0](args) 
              pass
      
      Rpy2Task = celery.register_task(Rpy2Task())
      async_result = Rpy2Task.delay(args)
      

      在工作人员运行的任务主体之外的任何地方调用 rinterface.initr() 都会导致上述崩溃。 Celery 通常与 redis 打包在一起,我发现这是一种支持 R 和 Python 之间交换信息的有用方式,但当然 Rpy2 也提供了灵活的方式来做到这一点。

      【讨论】:

      • 感谢您的解决方法。 rpy2 或 R 的 C-API 中有一个 buglet,具体取决于您如何看待它 (github.com/rpy2/rpy2/issues/729)。这已通过 rpy2-3.4.2 修复。
      猜你喜欢
      • 2015-01-12
      • 2020-11-05
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 2020-03-26
      • 1970-01-01
      • 2014-09-14
      • 2010-09-08
      相关资源
      最近更新 更多