これは非常に大きく、SOの質問には大きすぎるので、以下のコードは実際の実装を非常に単純化したデモです。pre-El Capitanマシン上のPython2.7を使用したOS Xのマルチプロセッシングエラー
一般に、イベントスケジューリングに使用する実行時にサブプロセスを起動する、学術的なコンテキスト用の広範なモジュールを作成しました。このモジュールを使用しているスクリプトやプログラムがエルキャピタン以前のマシンで閉じると、子プロセスに参加しようとする私の努力は失敗します。 OS Xは「Pythonが予期せず終了する」というエラーを表示し、孤立したプロセスが継続されます。 私はCSバックグラウンドなしでをマルチプロセッシングするのが大変です。これを診断することは私を超えています。
もし私があまりにも無知であるならば、私はRTFMに行きたいと思っています。具体的な指示は歓迎
私は、この例では、&代表コヒーレントであるかなり確信している、しかし、実際のプロジェクトでは、他のすべての実行時に動作しますが、エルキャピタンに完璧に動作することを知っているが、終了時に説明したように、一貫クラッシュします。私は不合理なタイムアウト値(30秒+)でそれをテストしました。常に同じ結果になります。
最後に、私はこれをPythonのデフォルトのマルチプロセッシングライブラリで開始し、dev友人としてbilliardに切り替えると、よりスムーズに実行できることが示唆されました。今日まで、私は何の違いも経験していません。
UPDATE: @threaded
デコレータの目的を与える機能を省略していました。コード内に存在するようになりました。
は一般的に、我々は持っている:
shared_queue = billiard.Queue() # or multiprocessing, have used both
class MainInstanceParent(object):
def __init__(self):
# ..typically init stuff..
self.event_ob = EventClass(self) # gets a reference to parent
def quit():
try:
self.event_ob.send("kkbai")
started = time.time()
while time.time - started < 1: # or whatever
self.event_ob.recieve()
if self.event_ob.event_p.is_alive():
raise RuntimeError("Little bugger still kickin'")
except RuntimeError:
os.kill(self.event_on.event_p.pid, SIGKILL)
class EventClass(object):
def __init__(self, parent):
# moar init stuff
self.parent = parent
self.pipe, child = Pipe()
self.event_p = __event_process(child)
def receive():
self.pipe.poll()
t = self.pipe.recv()
if isinstance(t, Exception):
raise t
return t
def send(deets):
self.pipe.send(deets)
def threaded(func):
def threaded_func(*args, **kwargs):
p = billiard.Process(target=func, args=args, kwargs=kwargs)
p.start()
return p
return threaded_func
@threaded
def __event_process(pipe):
while True:
if pipe.poll():
inc = pipe.recv()
# do stuff conditionally on what comes through
if inc == "kkbai":
return
if inc == "meets complex condition to pass here":
shared_queue.put("stuff inferred from inc")
'@ threaded'とは何ですか? 'Queue'を作成する以外は、コードスニペットは' billiard'を使用していないようです。 –
@RolandSmithばかばかしい監視、申し訳ありません。一定。 – Jonline
また、私は 'join'も見ませんか? –