質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1332閲覧

ブロッキングを行う処理を並列処理する方法がわからない

AariyJP

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

3クリップ

投稿2020/11/04 11:08

前提・実現したいこと

初心者です。間違いがあればご指摘ください。
ブロッキングを行う処理を並列処理する方法がわからない
ブロッキングを行う処理を並列処理で複数実行したいのですが、1行目しか実行されません。
2つとも実行させる方法を教えてほしいです。
エラーメッセージはないです。

該当のソースコード

python

1threading.Thread(target1) 2threading.Thread(target2)

試したこと

asyncio.start()を使用してもうまくいきませんでした。

###Pythonバージョン
Python 3.8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/11/04 12:55

ご提示のコードでは何をブロックしようとしているのか全く分かりませんが。
AariyJP

2020/11/04 13:00

target1やtarget2がブロッキングを行う関数だと考えてくださればと思います。
maisumakun

2020/11/04 13:05

「target1やtarget2」の処理内容はどのようなものでしょうか? (「ブロッキング」と言っても、Python内の都合で起きるものなのか、I/Oのブロックなのかで全く話が異なります)
AariyJP

2020/11/04 13:16

こんな感じの処理をしています。 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
teamikl

2020/11/05 01:16 編集

質問に、問題の現象を再現できるコードを提示してください。 asyncio を複数のスレッドで実行したいということでしょうか? 気になる点: self.loop はスレッド毎に作成されてますか? ブロッキング処理がasyncioのイベントループ( loop.run_forever() )の事だとすると、 スレッド毎にloopが必要になるはずです。 asyncio を使っているなら、やりたいことによっては run_in_executor を使う方が適切な場合もあります。
guest

回答2

0

記載頂いたコードではThreadの構築しかしていないように思えます。

こちらを参考にして実装してみてはいかがでしょうか。
https://qiita.com/tchnkmr/items/b05f321fa315bbce4f77

投稿2020/11/04 11:39

plasticgrammer

総合スコア629

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AariyJP

2020/11/04 11:54 編集

回答ありがとうございます。 指定された記事を参考にこのように書き直してみたところ、1行目のt1 = threading.Thread(target1)が実行された後、2行目のt2 = threading.Thread(target2)から実行されないのです。 t1 = threading.Thread(target1) t2 = threading.Thread(target2) t1.start() t2.start()
plasticgrammer

2020/11/04 12:32 編集

「threading.Thread(target1) が実行された後」とのことですが、『実行された』とは何をもって確認しているのでしょうか。 また、threading.Thread(target1) の実行時例外は発生していないのでしょうか。
AariyJP

2020/11/04 13:03 編集

実行されたか否かはIDEのbreakpointで確認しています。該当のソースコードにbreakpointを設定して、1行目でしか一時停止しないので、2行目から実行されていないのかなと思っています。 特にエラーメッセージは出力されていません。
plasticgrammer

2020/11/04 13:09

target1, target2 は引数なしの関数という認識ですが正しいでしょうか。 その場合に「target=」という形で指定しても同じ挙動になるのでしょうか。 t1 = threading.Thread(target=target1)
AariyJP

2020/11/04 13:33

やはり2行目のt2が実行されません。 以下のように変更しました。 t1 = threading.Thread(target=target1(hoge)) t2 = threading.Thread(target=target2(hogehoge)) t1.start() t2.start()
plasticgrammer

2020/11/05 00:05

引数があるのですか?投稿されたソースから変更があったのでしょうか。 引数があるのでしたら、記述は以下のようになるかと思います。 t1 = threading.Thread(target=target1, args=(hoge,))
AariyJP

2020/11/06 00:53

t1 = threading.Thread(target=target1(), args=hoge) のようにしてみましたがエラーが発生してしまいました。 target1()←に引数が必要みたいで... Traceback (most recent call last): File "C:\Users(ユーザー名)\AppData\Roaming\JetBrains\IdeaIC2020.2\plugins\python-ce\helpers\pydev\pydevd.py", line 1448, in _exec pydev_imports.execfile(file, globals, locals) # execute the script File "C:\Users(ユーザー名)\AppData\Roaming\JetBrains\IdeaIC2020.2\plugins\python-ce\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile exec(compile(contents+"\n", file, 'exec'), glob, loc) File "E:\Documents\IdeaProjects(プロジェクト名)\src\main\python\pyy\Initialize.py", line 96, in main t1 = threading.Thread(target=target1(), args=hoge) TypeError: target1() missing 1 required positional argument: 'hoge' python-BaseException
plasticgrammer

2020/11/06 01:08 編集

解決したとのことですが、一応コメントしておきます。 > target1()←に引数が必要みたいで... 前回例示したコードの通り、()は不要です。 記載したコードそのままで試して頂けるとありがたかったです。
guest

0

自己解決

自己解決しました。
Javaを使ってPythonのプロセスを複数起動させてあげれば無事エラーもなく完成しました。
ご回答いただいた皆様、本当にありがとうございます!

投稿2020/11/06 00:55

AariyJP

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問