2012-06-11 34 views
1

我有这个代码,通过套接字监听命令“更新播放列表”。 当它得到这个命令时,它知道数据库中的播放列表已经更新,它连接到数据库并下载新的播放列表,然后开始播放这些文件。 我试图找到最好的方法,因为它获取命令,然后调用Media_Player函数,它会播放播放列表中的所有视频,然后再返回到侦听套接字。Python代码,我应该线程?该怎么办?

在是否已发送另一个“更新播放列表”命令的平均时间,这个命令的发送者得到一个错误,因为这段代码不会被监听。我希望媒体播放器能够不间断播放,但它也必须不断收听,以防已被告知添加了新的播放列表。

然后,如果一个新的播放列表已添加,它会知道,当在播放列表中的一个文件播放完毕,可以切换到新的播放列表,然后继续前进。

我不知道该怎么做,我想我可以在一个过程中完成所有工作,并为播放列表中的每个文件生成一个新线程,这样可以直接回到听,但是我想怎么知道线程何时完成,因为播放列表中的每个文件的长度都不相同。

在功能listen_serv()看行“回归数据”

而且,这是否意味着它不关闭,因为它返回的连接?

# Echo server program 
import socket 
import time 
import Database as DB 

def listen_serv(): 
    HOST = ''     # Symbolic name meaning all available interfaces 
    PORT = 50007    # Arbitrary non-privileged port 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.bind((HOST, PORT)) 
    s.listen(1) 
    conn, addr = s.accept() 
    print 'Connected by', addr 
    while 1: 
     data = conn.recv(1024) 
     if not data: break 
     conn.sendall('OK') 
     return data 

    conn.close() 


while 1: 
    val= listen_serv() 
    if val=='Updated Playlist': 
     PlayList = DB.get_play_list() 
     Media_Player(PlayList)#This isnt implemented yet 
+0

您是否知道Python的Global Interpretor Lock问题?一次只能运行一个线程。你最好使用多处理库。 – octopusgrabbus

回答

1

您可能有两个进程运行一个是服务器,另一个是媒体播放器,它们之间有一个队列。

服务器推送的命令到在弹出的MediaPlayer他们,打每一个视频简单地检查队列那里有什么,如果有弹出并播放新的播放列表后的队列。

import socket 
import time 
import Database as DB 
from multiprocessing import Process, Queue 

def listen_serv(queue): 
    HOST = ''     # Symbolic name meaning all available interfaces 
    PORT = 50007    # Arbitrary non-privileged port 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.bind((HOST, PORT)) 
    s.listen(1) 
    conn, addr = s.accept() 
    print 'Connected by', addr 
    while 1: 
     data = conn.recv(1024) 
     if not data: 
      break 
     conn.sendall('OK') 
     queue.put(data) 
    conn.close() 

def media_player(queue): 
    while 1: 
     val = queue.get() # This will block until theres something on the queue. 
     if val == 'Updated Playlist': 
      PlayList = DB.get_play_list() 
      Media_Player(PlayList, queue) # Media_Player needs to check the queue and update when appropriate. 


if __name__ == '__main__': 
    q = Queue() 
    server = Process(target = listen_serv, args = (q,)) 
    media_player = Process(target = media_player, args = (q,)) 
    server.start() 
    media_player.start() 
    server.join() 
    media_player.join() 

您可以检查队列为空,queue.empty() 我肯定有更好的实现在那里,如果有错误/问题我道歉。

祝你好运。

+0

尽管我全心全意支持基本的实施策略,但还有几件事需要解决。 listen_serv()需要围绕.accept()调用增加一个while语句。父进程需要捕获KeyboardInterrupt或有其他方式离开干净。 Media_Player几乎不需要访问队列;这就是调用函数的作用。 – Bittrance

+0

我同意,我没有实现一个干净的方式来杀死每个进程,你可以简单地向队列中添加一个命令,告诉每个进程终止,就像'退出',就像第二个问题一样,“当其中一个播放列表中的文件已完成播放,它可以切换到新的播放列表并继续播放“,因此Media_player需要监视队列以知道何时加载新播放列表... –

+0

因此,我所能做的就是让媒体玩家在播放文件之间检查队列并相应更新。如果我设置媒体播放器来检查数据库中的标志,或者检查文件是否存在,这会不会有所不同? – user185955