前提・実現したいこと
初心者です。間違いがあればご指摘ください。
ブロッキングを行う処理を並列処理する方法がわからない
ブロッキングを行う処理を並列処理で複数実行したいのですが、1行目しか実行されません。
2つとも実行させる方法を教えてほしいです。
エラーメッセージはないです。
該当のソースコード
python
1threading.Thread(target1) 2threading.Thread(target2)
試したこと
asyncio.start()
を使用してもうまくいきませんでした。
###Pythonバージョン
Python 3.8
ご提示のコードでは何をブロックしようとしているのか全く分かりませんが。
target1やtarget2がブロッキングを行う関数だと考えてくださればと思います。
「target1やtarget2」の処理内容はどのようなものでしょうか?
(「ブロッキング」と言っても、Python内の都合で起きるものなのか、I/Oのブロックなのかで全く話が異なります)
こんな感じの処理をしています。
def run(self, *args, **kwargs):
loop = self.loop
try:
loop.add_signal_handler(signal.SIGINT, lambda: loop.stop())
loop.add_signal_handler(signal.SIGTERM, lambda: loop.stop())
except NotImplementedError:
pass
async def runner():
try:
await self.start(*args, **kwargs)
finally:
if not self.is_closed():
await self.close()
def stop_loop_on_completion(f):
loop.stop()
future = asyncio.ensure_future(runner(), loop=loop)
future.add_done_callback(stop_loop_on_completion)
try:
loop.run_forever()
except KeyboardInterrupt:
log.info('Received signal to terminate bot and event loop.')
finally:
future.remove_done_callback(stop_loop_on_completion)
log.info('Cleaning up tasks.')
_cleanup_loop(loop)
if not future.cancelled():
try:
return future.result()
except KeyboardInterrupt:
# I am unsure why this gets raised here but suppress it anyway
return None
質問に、問題の現象を再現できるコードを提示してください。
asyncio を複数のスレッドで実行したいということでしょうか?
気になる点: self.loop はスレッド毎に作成されてますか?
ブロッキング処理がasyncioのイベントループ( loop.run_forever() )の事だとすると、
スレッド毎にloopが必要になるはずです。
asyncio を使っているなら、やりたいことによっては
run_in_executor を使う方が適切な場合もあります。
回答2件
あなたの回答
tips
プレビュー