2017-06-26 9 views
0
飾る

では動作しませんが、それは動作しませんし、例外をキャッチすることはできません、私のコードを示しています。Pythonのマルチプロセッシング・プールは、私は、プールをマルチプロセッシングをもとに飾るを記述しようとしています

def handle_request(response): 
    print str(response) 

def run_in_process(process_num): 
    def _run_in_process(f): 
     def __run_in_process(*args, **kwargs): 
      pool = multiprocessing.Pool(processes=process_num) 
      for i in range(process_num): 
       pool.apply_async(f, args=args, kwds=kwargs, callback=kwargs.get("callback")) 
      pool.close() 
      pool.join() 

     return __run_in_process 

    return _run_in_process 


@run_in_process(process_num) 
def main(): 
    http_client = AsyncHTTPClient() 
    http_client.fetch(url, callback=handle_request) 
    global loop 
    loop = tornado.ioloop.IOLoop.instance() 
    if loop._running is False: 
     loop.start() 


if __name__ == '__main__': 
    main() 

は私のログを表示します:

/usr/bin/python2.7 /home/workspace/py_project/crawler/center/sample.py 
Process finished with exit code 0 

が、ときに私はそれが同じように、うまく機能マルチプロセッシングを使用する場合、私は、私の方法を変更します。

def handle_request(response): 
    print str(response) 

def run_in_process(process_num): 
    def _run_in_process(f): 
     def __run_in_process(*args, **kwargs): 
      _processes = [] 
      for i in xrange(process_num): 
       p = multiprocessing.Process(target=f, args=args, kwargs=kwargs) 
       p.start() 
       _processes.append(p) 

      for p in _processes: 
       p.join() 

     return __run_in_process 
    return _run_in_process 


@run_in_process(process_num) 
def main(): 
    http_client = AsyncHTTPClient() 
    http_client.fetch(url, callback=handle_request) 
    global loop 
    loop = tornado.ioloop.IOLoop.instance() 
    if loop._running is False: 
     loop.start() 


if __name__ == '__main__': 
    main() 

ショー私のログ:

/usr/bin/python2.7 /home/workspace/py_project/crawler/center/sample.py 
HTTPResponse(_body=None,buffer=<_io.BytesIO object at 0x7f2fdaa21ef0>,code=200,effective_url='http://www.baidu.com',error=None,headers=<tornado.httputil.HTTPHeaders object at 0x7f2fdaa425d0>,reason='OK',request=<tornado.httpclient.HTTPRequest object at 0x7f2fdaa42250>,request_time=0.014312028884887695,time_info={}) 
HTTPResponse(_body=None,buffer=<_io.BytesIO object at 0x7f2fdaa21ef0>,code=200,effective_url='http://www.baidu.com',error=None,headers=<tornado.httputil.HTTPHeaders object at 0x7f2fdaa43450>,reason='OK',request=<tornado.httpclient.HTTPRequest object at 0x7f2fdaa430d0>,request_time=0.02327895164489746,time_info={}) 
HTTPResponse(_body=None,buffer=<_io.BytesIO object at 0x7f2fdaa21ef0>,code=200,effective_url='http://www.baidu.com',error=None,headers=<tornado.httputil.HTTPHeaders object at 0x7f2fdaa43510>,reason='OK',request=<tornado.httpclient.HTTPRequest object at 0x7f2fdaa43190>,request_time=0.026951074600219727,time_info={}) 
HTTPResponse(_body=None,buffer=<_io.BytesIO object at 0x7f2fdaa21ef0>,code=200,effective_url='http://www.baidu.com',error=None,headers=<tornado.httputil.HTTPHeaders object at 0x7f2fdaa42690>,reason='OK',request=<tornado.httpclient.HTTPRequest object at 0x7f2fdaa42310>,request_time=0.0552978515625,time_info={}) 
HTTPResponse(_body=None,buffer=<_io.BytesIO object at 0x7f2fdaa24ef0>,code=200,effective_url='http://www.baidu.com',error=None,headers=<tornado.httputil.HTTPHeaders object at 0x7f2fdaa39e10>,reason='OK',request=<tornado.httpclient.HTTPRequest object at 0x7f2fdaa39a90>,request_time=0.05612993240356445,time_info={}) 

私は何が起こっているのか理解できず、同じことがgeventで起こった。誰でも私を助けてください。

答えて

0

Python 2.7のmultiprocessing.Poolは、スケジュールされた関数が例外を発生させた場合にコールバックを実行しません。これはPython 3で修正され、error_callbackが追加されました。

results = [] 

pool = multiprocessing.Pool(processes=process_num) 
for i in range(process_num): 
    result = pool.apply_async(f, args=args, kwds=kwargs, callback=kwargs.get("callback")) 
    results.append(result) 

for result in results: 
    result.get() # this will raise the exception in the worker 

pool.close() 
pool.join() 
+0

素敵な提案:

は、私が実際にエラーを確認するために次のように内側のループを変更することをお勧め!例外スタックが表示されます。 トレースバック(最新の最後の呼び出し): ファイル "/home/xx/workspace/center/sample.py"、行43、 main() ファイル "/ home/xx/workspace/py_project /clrler/center/sample.py "、行23、__run_in_process result.get() ファイル" /usr/lib/python2.7/multiprocessing/pool.py "、行558、取得 raise self._value cPickle.PicklingError:をpickleできません:属性ルックアップ__builtin __。function failed – lileilei

+0

例外を適切にフォーマットしたものを追加して質問を更新してください。あなたはどのOSを使用していますか?それはWindowsですか? – noxdafox

関連する問題