Конструирую тут простую програмку с синхронным управлением несколькими плеерами (mplayer-ы в slave режиме) с использованием mplayer.py ( https://pypi.python.org/pypi/mplayer.py/0.7.0 ) и tkinter.
По причине некоторой латентности мплеера возникла необходимость выполнять часть задач в отдельных потоках.
Т.к. я кроил уже почти готовый скрипт, то архитектура получилась далеко не ахти, но отзывчивость интерфейса явно улучшилась.
для управления плеером (каждым в отдельности) я построил такую конструкцию
def start_worker(self, player): def _worker(): while self.running: wq = self.worker_queue gq = self.gui_queue while wq.qsize() and player and self.running: try: (command, params) = wq.get(0) if command == 'pause': player.pause() self.paused = not self.paused state = 'P' if player.paused else '' gq.put({'lb_state': state }) elif command == 'stop': if not player.paused: player.pause() self.paused = True gq.put({'lb_state': 'P' }) # ...... else: print 'unknown command %s (%s)'%(command, params) except Queue.Empty: time.sleep(0.1) print '_worker stop' return _worker #...... w_thread = threading.Thread(target = self.start_worker(self.player)) w_thread.start() #......
ну и дальше, при необходимости, вместо прямого вызова self.player.pause() я добавляю комманду в очередь
def pause(self, b=None): if self.player: if b == True: self.worker_queue.put(('stop','')) elif b == False: self.worker_queue.put(('play','')) else: self.worker_queue.put(('pause',''))
[ p.pause(self.paused) for p in self.v_pull ]
Ну и второй вопрос - иногда не завершается какой то поток. остаётся весеть питон-процесс в памяти и откусываться хороший шмат от процессора вечным циклом. Проверку на self.running поставил, вроде бы, везде. Как можно отловить причину незавершения ?
Спасибо.