我有一些基于pygame的简单mp3播放器,现在我想实现交叉淡入淡出效果。但偶尔pygame.mixer.music并不能及时支持两个来源的播放。但是如果我使用多处理模块在新进程中初始化新的pygame混合器,它就可以工作。像这样:
from multiprocessing import Process
class Player(object):
def play(self):
#start playback
def about_to_finish(self):
#check here if are ready to start new sound in parallel
def finished(self):
#check here if playback is finished
def run_player(player):
player.play()
def run()
player = Player()
p = Process(target=run_player, args=(player ,))
p.start()
while not player.finished():
#this will never return True because
# this object's method play wasn't ever called.
if player.about_to_finish():
#launch new player
run()
time.sleep(0.5)
p.join()
if __name__ == '__main__':
run()
问题是:在运行功能中创建的播放器实例不会改变它的状态,我认为在 Process 中的某处创建了一个副本。那么有没有办法调用方法或获取从运行函数发送到新进程的实例属性?
我知道它不是最好的实现,我可以通过其他方式使用它,或者不要使用pygame(我已经使用Gstreamer制作它看起来很好)。但现在它的学术兴趣,如何在python中的进程之间进行通信(共享类实例状态)是由一个聪明的家伙处理的。