2016-11-15 7 views
0

フロントエンドコールで実行される、時間のかかるバックエンドジョブを実行しようとしています。このバックエンドジョブは、セマフォを解放するコールバックメソッドが完了したときにコールバックメソッドを実行する必要があります。フロントエンドは、ジョブを開始するための呼び出しからの応答を得るために、長いプロセスが終了するのを待つ必要はありません。Python 2.6でコールバックでメソッドを非同期に実行

私はこの問題を解決するためにマルチプロセッシングライブラリのPoolクラスを使用しようとしていますが、いくつかの問題が発生しています。つまり、apply_asyncに渡されたメソッドを実際に実行する唯一の方法は、apply_async呼び出しによって返されたApplyResultオブジェクトの.get()メソッドを呼び出すことです。

これを解決するために、私はターゲットがapply_result.getであるProcessオブジェクトを作成すると考えました。しかし、これは動作していないようです。

私はここで紛失しているという基本的な理解はありますか?この問題を解決するために何を提案しますか?事前に助けを

p = Pool(1) 
result = p.apply_async(long_process, args=(config, requester), callback=complete_long_process) 
Process(target=result.get).start() 
response = {'status': 'success', 'message': 'Job started for {0}'.format(requester)} 
return jsonify(response) 

ありがとう:

は、ここで私が今持っているもののスニペットの例です!

答えて

0

なぜここにProcessオブジェクトが必要なのかよくわかりません。このスニペットをご覧ください:

#!/usr/bin/python 

from multiprocessing import Pool 
from multiprocessing.managers import BaseManager 
from itertools import repeat 
from time import sleep 

def complete_long_process(foo): 
    print "completed", foo 

def long_process(a,b): 
    print a,b 
    sleep(10)  

p = Pool(1) 
result = p.apply_async(long_process, args=(1, 42), 
         callback=complete_long_process) 

print "submitted" 
sleep(20) 

私が達成しようとしていることを理解していれば、これはまさにそれです。 apply_asyncを呼び出すとすぐにlong_process関数が起動され、メインプログラムの実行が継続されます。完了すると、complete_long_processが呼び出されます。 long_processを実行するためにgetメソッドを使用する必要はなく、コードは何もブロックして待機しません。

long_processが実行されていない場合は、long_processのどこかに問題があると思われます。

ハンヌ

関連する問題