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

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

新規登録して質問してみよう
ただいま回答率
87.20%
イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

解決済

Python プロセス間通信 コードレビュー依頼

RRR
RRR

総合スコア5

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

1回答

-3評価

2クリップ

270閲覧

投稿2022/04/08 15:42

前提

Pythonでプロセス間通信を非同期処理とイベントハンドラを用いて
コーディングしてみたのでコードレビューをして頂きたいです。
変数の扱い方やクラス設計の仕方など
どんなことでもいいのでアドバイスがあればお願いします。

動作

  1. mainはworker1のスレッドを走らせイベントが発生するのを待機する
  2. worker1の処理中にイベントを発生させ通知する
  3. mainはイベント通知を受け取り、worker2をスレッドで走らせる

※Workerが増えてもイベントが受け取れる作りにしています。

該当のソースコード

Python

import threading import time #グローバル変数 eventhandler = None class Main: #Worker1をスレッドで走らせてイベント発生をひたすら待つ def main(self): event = threading.Event() Worker1(event).start() while True: #イベントが発生するかを1秒間だけ待つ event_is_set = event.wait(1) #イベントが発生したらイベントハンドラをスレッドで実行 if event_is_set: event.clear() eventhandler.start() class Worker1(threading.Thread): def __init__(self, event:threading.Event): threading.Thread.__init__(self) self.event = event #override def run(self): for i in range(1,11): print('Worker1 working: ' + str(i) +'[sec]') #5秒たったらイベントを発生させイベントハンドラに格納 if i == 5: print('event_set') self.event.set() global eventhandler eventhandler = Worker2() time.sleep(1) class Worker2(threading.Thread): def __init__(self): threading.Thread.__init__(self) #override def run(self): for i in range(1,6): print('Worker2 working: ' + str(i) +'[sec]') time.sleep(1) if __name__ in '__main__': Main().main()

出力

Worker1 working: 1[sec] Worker1 working: 2[sec] Worker1 working: 3[sec] Worker1 working: 4[sec] Worker1 working: 5[sec] event_set Worker2 working: 1[sec] Worker2 working: 2[sec] Worker1 working: 6[sec] Worker1 working: 7[sec] Worker2 working: 3[sec] Worker2 working: 4[sec] Worker1 working: 8[sec] Worker2 working: 5[sec] Worker1 working: 9[sec] Worker1 working: 10[sec]

補足情報(FW/ツールのバージョンなど)

Python 3.10
Windows 10
Visual Studio Code

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

y_waiwai

2022/04/08 21:23

提示のコードはどういう問題があるんでしょうか
RRR

2022/04/09 00:19

ここのコードはもっとこうした方がいいよなどのアドバイスを頂きたいです。
bsdfan

2022/04/10 00:59

コードではない部分ですが、これをプロセス間通信と呼ぶのは違和感があります。
RRR

2022/04/10 07:49

@bsdfan プロセス間通信と検索すると以下のような説明でした。 「コンピュータ上で実行中のプログラムの間でデータをやり取りするための仕組み。あるプログラムから別のプログラムへデータやメッセージを通知したり、データの提供依頼や処理依頼を行ったり、依頼に対する結果を返したりすることができる。」 今回のコードではMainクラスがWorkerクラスに「処理依頼」をしているのでプロセス間通信に当てはまるのかなと思いました。
bsdfan

2022/04/10 08:41

一般的には、別のプロセスの間での通信を、プロセス間通信と呼ぶことが多いと思います。 (メモリ空間が異なっているなかで、情報をどうやりとりするか)

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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