Python代码,我应该线程吗?该怎么办?

时间:2012-06-11 21:14:24

标签: python multithreading sockets

我有这个代码,它通过套接字监听命令'Updated Playlist'。 当它获得此命令时,它知道数据库中的播放列表已更新,并且它连接到数据库并下载新的播放列表,然后它开始播放这些文件。 我正在尝试找到关于此的最佳方法,因为当它获取命令时,然后调用Media_Player函数,它将播放播放列表中的所有视频,然后返回以侦听套接字。

同时,如果发送了另一个“更新的播放列表”命令,则此命令的发送者会收到错误,因为此代码不会侦听。我希望媒体播放器能够不停地播放,但是如果被告知已经添加了新的播放列表,它也必须经常收听。

然后,如果添加了新的播放列表,它将知道播放列表中的某个文件播放完毕后,可以切换到新的播放列表并继续播放。

我不知道如何解决这个问题,我想我可以在一个进程中完成所有操作并为播放列表中的每个文件生成一个新线程,因此它可以直接回到监听,但是那我怎么想知道线程何时完成,因为播放列表中的每个文件长度都不同。

同样在函数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

1 个答案:

答案 0 :(得分:1)

你可以运行两个进程,一个是服务器,另一个是MediaPlayer,其间有一个Queue。

服务器将命令推送到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()检查队列是否为空 我确定有更好的实现,如果有错误/问题,我道歉。

祝你好运。