2017-03-28 8 views
1

私は新しいPython 3.5コルーチンを使ってイベントベースのシステムを使用しています。私はイベントを登録し、これらのイベントはシステムによって呼び出されます。Pythonマルチプロセッシングの連続処理が待たれている

@event 
aysnc def handleevent(args): 
    # handle the event 

作業(時間がかかる)を処理するためにいくつかのクラスを初期化する必要があります。インスタンスメソッドを呼び出すと時間もかかります(実際には特定のサイトを参照するためにセレンを使用します)。次のコード

# supposedly since this is multiprocessing this is a different driver per process 
driver = None 
def init(): 
    # do the heavy initialization here 
    global driver 
    driver = webdriver.Chrome() 

def longworkmethod(): 
    ## need to return some data 
    return driver.dolongwork() 

class Drivers: 
""" A class to handle async and multiprocessing""" 
    def __init__(self, numberOfDrivers): 
     self.pool = multiprocessing.Pool(processes=numberOfDrivers, initializer=init)  

    async def dowork(self, args): 
     return self.pool.apply_async(longworkmethod, args=args) 


### my main python class 
drivers = Drivers(5) 

@event 
aysnc def handleevent(args): 
    await drivers.dowork(args) 

@event 
aysnc def quit(args): 
    ## do cleanup on drivers 
    sys.exit(0) 

このコードのような

理想的には私が望む何かが動作しませんが、私は多くの異なる方法を試してみましたし、どれも私がやりたいことができるように思えません。

これは正確な形式である必要はありませんが、マルチプロセッシングを必要とするプログラムで、待ち行列とコルーチンをどのように混合するのですか?

答えて

2

技術的に言えば、asynciomultiprocessingの混合を制限するものはありませんが、これを避けることをおすすめします。スレッドごとにイベントループが必要になり、前後に情報を渡すのが難しくなるので、複雑さが増します。どちらか一方だけを使用してください。

asyncioは、AbstractEventLoop.run_in_executorなどの別のスレッドでタスクを実行するための関数を提供します。 (コルーチン内のセレンを呼び出す)

  • https://stackoverflow.com/a/28492261/66349
  • セレンは、ブロッキング(非asyncio)インターフェース、しかし、それは音を持っているとして、代わりにあなただけのmultiprocessingを使用することができますこれらの答え

    +0

    私はセレン(マルチプロセッシング)が必要なのでミキシングを避けることはできません。私が使っているイベントシステムは厳密にasyncioです。しかし、私はそれらのリンクをチェックアウトします。私はそれらを働かせることができるかどうか見てください。 – leftsync

    +0

    セレンはブロックされていますが、マルチプロセッシングが必要なわけではありません。ブロックビットには 'run_in_executor'を使い、それ以外はメインスレッド/イベントループに入れてください。 –

    +0

    リンクが役立つようです。私は、 "get"のような個々の高価なコールに対してrun_in_executorを使うべきですか、それとも複数の高価なコールを持つ高価な高価な機能を実行できますか?違いはありますか? – leftsync

    関連する問題