2

python-javabridgeに基づくWeka 用の Python ラッパーを使用しています。私は実行する長いタスクがあるため、Celeryを使用しています。問題は私が得ることです

A fatal error has been detected by the Java Runtime Environment:

  SIGSEGV (0xb) at pc=0x00007fff91a3c16f, pid=11698, tid=3587

JRE version:  (8.0_31-b13) (build )
Java VM: Java HotSpot(TM) 64-Bit Server VM (25.31-b07 mixed mode bsd-amd64 compressed oops)
Problematic frame:
C  [libdispatch.dylib+0x616f]  _dispatch_async_f_slow+0x18b

Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again

If you would like to submit a bug report, please visit:
    http://bugreport.java.com/bugreport/crash.jsp
The crash happened outside the Java Virtual Machine in native code.
See problematic frame for where to report the bug.

スレッド内で JVM を開始するとき。そのために、次の 2 行のコードが使用されます ( weka.core.jvmから)。

javabridge.start_vm(run_headless=True)
javabridge.attach()

私が読んだことから、おそらくJVMがCeleryスレッドに接続されていないことが原因です。ただし、javabridge.attach()実際にはその中で実行されます。

何が欠けていますか?


編集:問題を引き起こしているコードを特定しました。これはNLTK トークナイザーと関係があります。次のコード ( Vebjorn の回答によると) は、エラーを再現します。

# hello.py
from nltk.tokenize import RegexpTokenizer
import javabridge
from celery import Celery

app = Celery('hello', broker='amqp://guest@localhost//', backend='amqp')

started = False    

@app.task
def hello():
    global started
    if not started:
        print 'Starting the VM'
        javabridge.start_vm(run_headless=True)
        started = True

    sentence = "This is a sentence with some numbers like 1, 2 or and some weird symbols like @, $ or ! :)"
    tokenizer = RegexpTokenizer(r'\w+')
    tokenized_sentence = tokenizer.tokenize(sentence.lower())
    print "Tokens:", tokenized_sentence

    return javabridge.run_script('java.lang.String.format("Hello, %s!", greetee);',
                             dict(greetee='world'))

JVM を起動しなくても、コードは正しく実行されます。Celery タスクとして実行されていない場合にも機能します。クラッシュする理由がわかりません。


EDIT 2:実際にはクリーンな Ubuntu 環境 ( Dockerized ) で動作しますが、Mac OS X Yosemite (v10.3) では動作しません。


編集 3:コメントで述べたように、関数from nltk.tokenize import RegexpTokenizer内のタスク ラッパー内で実行された場合にhello()機能します。

4

1 に答える 1