1

ソケットを介して「更新されたプレイリスト」コマンドをリッスンするこのコードがあります。このコマンドを受け取ると、データベース内のプレイリストが更新されたことを認識し、データベースに接続して新しいプレイリストをダウンロードし、これらのファイルの再生を開始します。コマンドを取得して Media_Player 関数を呼び出すと、ソケットをリッスンするために戻る前に、プレイリスト内のすべてのビデオが再生されるため、これについて最善の方法を見つけようとしています。

その間、別の 'Updated Playlist' コマンドが送信された場合、このコードはリッスンしないため、このコマンドの送信者はエラーを受け取ります。メディア プレーヤーをノンストップで再生したいのですが、新しい再生リストが追加されたことが通知された場合に備えて、常にリッスンしている必要もあります。

次に、新しいプレイリストが追加された場合、それが認識され、プレイ リスト内のファイルの 1 つが再生を終了すると、新しいプレイリストに切り替えて続行できます。

どうすればいいのかわかりません。すべてを 1 つのプロセスで実行し、再生リスト内のファイルごとに新しいスレッドを生成して、すぐにリスニングに戻ることができると思っていましたが、どうすればよいでしょうか。プレイリスト内の各ファイルの長さが異なるため、スレッドがいつ終了したかがわかると思います。

また、関数 listen_serv() で「return data」という行を参照してください。これは、戻ったために接続を閉じていないことを意味しますか?

# 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
4

1 に答える 1

1

1 つはサーバーで、もう 1 つは MediaPlayer で、その間に Queue がある 2 つのプロセスを実行することができます。

サーバーは、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() 。バグ/問題がある場合は、より良い実装があることを確認してください。お詫び申し上げます。

幸運を。

于 2012-06-11T21:39:45.040 に答える