2017-02-23 67 views
0

Я создал программу, которая транслируется через твиттер и основана на результате генерируемых твитами, которые он воспроизводит музыку, используя библиотеку pygame. Ниже приведен образец моего кода.Threading multiple functions in python

class listener(StreamListener): 

def on_status(self, status): 
    global mood_happy, mood_sad, mood_angry, mood_shocked, mood_romantic 

    try: 
     # print status 
     tweet_text = status.text 
     for mood_n_score in [[happy, 'mood_happy'], [sad, 'mood_sad'], [angry, 'mood_angry'], 
          [shocked, 'mood_shocked'], [romantic, 'mood_romantic']]: 
      lst_mood = mood_n_score[0] 
      type_mood = mood_n_score[1] 

      for mood in lst_mood: 
       if mood in tweet_text: 
        if type_mood == 'mood_happy': 
         mood_happy += 1 
        elif type_mood == 'mood_sad': 
         mood_sad += 1 
        elif type_mood == 'mood_angry': 
         mood_angry += 1 
        elif type_mood == 'mood_shocked': 
         mood_shocked += 1 
        else: 
         mood_romantic += 1 
        break 

     print('\n----------------') 
     print 'mood_happy:', mood_happy 
     print 'mood_sad:', mood_sad 
     print 'mood_angry:', mood_angry 
     print 'mood_shocked:', mood_shocked 
     print 'mood_romantic:', mood_romantic 



     top_mood=max(mood_happy,mood_sad,mood_angry,mood_shocked,mood_romantic) 
     if top_mood==mood_happy: 
      print "the mood is: happy" 
      pygame.mixer.music.load(file.mp3) 
      pygame.mixer.music.play() 

Как вы можете видеть, у меня есть класс кос, который потоки через твиттер непрерывно и печатает верхнее настроение. Когда я запускаю свой код для воспроизведения mp3-файла, потоковая передача останавливается и воспроизводится только музыка. Как я могу сделать свой поток программы через твиттер и играть музыку одновременно?

Спасибо!

ответ

0

Я никогда не использовал pygame, но, основываясь на том, что он делает, я думаю, что, вероятно, могу предположить, что он не является потокобезопасным.

Что бы я сделал, это иметь потоковый код в потоке с использованием модуля threading и постоянно поддерживать логику воспроизведения музыки в основном потоке для установки threading.Event.

import threading 
import pygame 


new_mood_event = threading.Event() 


class TwitterStreamer(StreamListener): 
    def run(self): 
     while True: # keep the streamer going forever 
      pass # define your code here 

    def on_status(self, status): 
     # ... Define your code here 
     if top_mood == mood_happy: 
      new_mood_event.mp3_file_path = 'happy_file.mp3' 
      new_mood_event.set() # alert the main thread we have a new mood to play 


if __name__ == '__main__': 
    twitter_streamer = TwitterStreamer() 
    streaming_thread = threading.Thread(target=twitter_streamer.run) # creates a thread that will call `twitter_streamer.run()` when executed 
    streaming_thread.start() # starts the thread 

    # everything from here will be run in the main thread 
    while True: # creates an "event loop" 
     new_mood_event.wait() # blocks the main thread until `new_mood_event.set()` is called by `on_status` 
     new_mood_event.clear() # clears the event. if we don't clear the event, then `new_mood_event.wait()` will only block once 
     pygame.mixer.music.load(new_mood_event.mp3_file_path) 
     pygame.mixer.music.play() 
+0

Эй, спасибо за ваш ответ! :) Не могли бы вы объяснить мне, что делают последние две части кода? –

+0

Какая часть? Где я создаю 'streaming_thread',' new_mood_event.wait() 'then' new_mood_event.clear()' или модифицированный код pygame? – Terrence

+0

От __name___ == __ 'main' __: до последней строки. Я действительно не понимаю потоки, поэтому это кажется мне чуждым. : p –