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

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

新規登録して質問してみよう
ただいま回答率
87.20%
マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

非同期処理

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

Python

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

解決済

Python Observerパターンの実装

RRR
RRR

総合スコア5

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

非同期処理

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

Python

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

1回答

0評価

0クリップ

175閲覧

投稿2022/04/20 08:21

前提

Observerパターンを使用してスレッド処理をコーディングしています。

実現したいこと

Worker A, WorkerBの処理を同時に開始させ、WorkerA,Bの処理が終了した後にWorkerCの処理を開始したいです。
監視対象である変数(model.watch_variable)の変更で上記を制御したいと考えています。
監視対象の変数で上記の制御ができなければ、threading.Threadクラスのjoin()や、threading.Eventクラスのwait(),set()でも実現できそうなのですが、どのように実装すればいいのでしょうか。
現状はすべてのWorkerが同時に処理を始めてしまいます。

該当のソースコード

Python

def main(): #インスタンス生成 A = WorkerA() B = WorkerB() C = WorkerC() model = Model() #イベントハンドラをリストに格納 model.eh += A.inifile_read #inifile読込 model.eh += B.folder_create #フォルダ作成 #監視対象の変数を変更 → リストに格納されたイベントハンドラが実行 model.watch_variable = 1 #イベントハンドラのリストをクリア model.eh.clear() #イベントハンドラをリストに格納 model.eh += C.excel_file_write #エクセル書き込み #監視対象の変数を変更 → リストに格納されたイベントハンドラが実行 model.watch_variable = 2 if __name__ == '__main__': main()

Python

import threading class EventHandler(object): def __init__(self): self.eventhandler = [] def __iadd__(self, handler): if handler not in self.eventhandler: self.eventhandler.append(handler) return self def __isub__(self, handler): self.eventhandler.remove(handler) return self def fire(self): for func in self.eventhandler: threading.Thread(target=func).start() def clear(self): self.eventhandler.clear() return self class Model: def __init__(self): self.eh = EventHandler() self.__watch_variable = None #監視対象の変数 @property def watch_variable(self): return self.__watch_variable #監視対象変数のセッター @watch_variable.setter def watch_variable(self, value): if not self.__watch_variable == value: self.__watch_variable = value self.eh.fire()

Python

import time class WorkerA: def __init__(self): pass #実処理 def inifile_read(self): print('workerA : Start') time.sleep(5) print('workerA : Stop') class WorkerB: def __init__(self): pass #実処理 def folder_create(self): print('workerB : Start') time.sleep(7) print('workerB : Stop') class WorkerC: def __init__(self): pass #実処理 def excel_file_write(self): print('workerC : Start') time.sleep(7) print('workerC : Stop')

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

Python3.10
VScode
Windows 10

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

非同期処理

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

Python

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