Найти - Пользователи
Полная версия: threading, Queue, управление mplayer-ом.
Начало » Python для новичков » threading, Queue, управление mplayer-ом.
1
alexzander77
Добрый день.

Конструирую тут простую програмку с синхронным управлением несколькими плеерами (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 поставил, вроде бы, везде. Как можно отловить причину незавершения ?

Спасибо.
lorien
Лень понимать до конца ваш код, но такая теория, один из воркеров хапает своё задание, а потом чужое, пока другой воркер зависает по некоторым причинам.
alexzander77
Думал уже. воркеры, предполагается, для каждого плеера свои. Каждый плеер являет собой екземпляр со своим собственным воркером и очередями.

Также, т.к. у каждого объекта только один воркер в отдельном потоке, никаких loc-ов я не использовал.

Наверное mplayer не успевает изменить своё состояние между двумя коммандами.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB