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()
機能します。