私は新しい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)
このコードのような
理想的には私が望む何かが動作しませんが、私は多くの異なる方法を試してみましたし、どれも私がやりたいことができるように思えません。
これは正確な形式である必要はありませんが、マルチプロセッシングを必要とするプログラムで、待ち行列とコルーチンをどのように混合するのですか?
私はセレン(マルチプロセッシング)が必要なのでミキシングを避けることはできません。私が使っているイベントシステムは厳密にasyncioです。しかし、私はそれらのリンクをチェックアウトします。私はそれらを働かせることができるかどうか見てください。 – leftsync
セレンはブロックされていますが、マルチプロセッシングが必要なわけではありません。ブロックビットには 'run_in_executor'を使い、それ以外はメインスレッド/イベントループに入れてください。 –
リンクが役立つようです。私は、 "get"のような個々の高価なコールに対してrun_in_executorを使うべきですか、それとも複数の高価なコールを持つ高価な高価な機能を実行できますか?違いはありますか? – leftsync