print("KONIEC", pid, len(known_processes), current_thread().name) if not known_processes: try: global app_proc app_proc.kill() app_proc = None except SystemError: print('Error during killing chroma app') # access global variables safely processing_scheduler = ThreadPoolScheduler(1) scanner = Observable.create(lambda subscriber: scan_processes(subscriber)) \ .distinct() \ .subscribe_on(NewThreadScheduler()) \ .publish() # start chroma app when valid process shows up scanner.observe_on(processing_scheduler) \ .subscribe(handle_audio_start) # tear down chroma app when all valid processes are terminated scanner.flat_map(lambda pid: Observable.from_callable(wait_for_end(pid), NewThreadScheduler())) \ .observe_on(processing_scheduler) \ .subscribe(handle_audio_end) scanner.connect() input()